>  기사  >  백엔드 개발  >  C# 고급 프로그래밍 12장 동적 언어 확장

C# 고급 프로그래밍 12장 동적 언어 확장

大家讲道理
大家讲道理원래의
2017-04-11 14:05:592263검색

(1) DLR

C#4의 동적 기능은 동적 Language Runtime(동적 언어 런타임, DLR의 일부). DLRCLR에 추가된 서비스 집합입니다.

(2) 동적 유형

동적 유형 허용 컴파일 중에 유형 검사를 무시하는 코드를 작성하세요. 컴파일러는 dynamic 유형의 객체에 대해 정의된 모든 작업이 유효하다고 가정하고 컴파일러는 이를 실행하기 전에 오류를 확인하지 않습니다.

예:


dynamic person = "人";string firstName = person.FirstName;

이 두 줄의 코드는 컴파일러로 컴파일할 수 있지만 클릭하면 오류가 보고됩니다. 실행:

dynamic 유형이 유용하지만 가격.

(3) DLR ScriptRuntime

을 포함하여 애플리케이션 편집 기능과 스크립트 간에 값 전달을 통해 애플리케이션은 스크립트를 사용하여 작업을 완료할 수 있습니다.

(4) 의 DynamicObject 및 ExpandoObject

DynamicObject를 파생하거나 ExpandoObject를 사용하여 고유한 동적 개체를 만들 수 있습니다.

DynamicObject 파생을 사용하여 동적 객체를 생성하려면 TrySetMember(), TryGetMember() 및 TryInvokeMember()의 세 가지 메서드를 재정의해야 합니다.

ExpandoObject와 DynamicObject를 사용하여 파생시키는 것의 차이점은 메서드를 재정의할 필요가 없다는 것입니다.

예:

class Program
{
    static void Main(string[] args)
    {
        Func<string, string, string> getFullName = (f, l) => { return f + " " + l; };
        dynamic byexobj = new ExpandoObject();
        byexobj.FirstName = "李";
        byexobj.LastName = "四";
        byexobj.GetFullName = getFullName;
        Console.WriteLine(byexobj.GetType());
        Console.WriteLine(byexobj.GetFullName(byexobj.FirstName, byexobj.LastName));
        Console.WriteLine("=====================");
        dynamic dyobj = new MyDynamicObject();
        dyobj.FirstName = "张";
        dyobj.LastName = "三";
        dyobj.GetFullName = getFullName;
        Console.WriteLine(dyobj.GetType());
        Console.WriteLine(dyobj.GetFullName(dyobj.FirstName, dyobj.LastName));
        Console.ReadKey();
    }
}

public class MyDynamicObject : DynamicObject
{
    Dictionary<string, object> dynamicData = new Dictionary<string, object>();
    public override bool TrySetMember(SetMemberBinder binder, object value)
    {
        dynamicData[binder.Name] = value;
        return true;
    }
    public override bool TryGetMember(GetMemberBinder binder, out object result)
    {
        bool success = false;
        result = null;
        if (dynamicData.ContainsKey(binder.Name))
        {
            result = dynamicData[binder.Name];
            success = true;
        }
        else
        {
            result = "未找到该属性的值";
            success = false;
        }
        return success;
    }
    public override bool TryInvokeMember(InvokeMemberBinder binder, object[] args, out object result)
    {
        dynamic method = dynamicData[binder.Name];
        result = method((string)args[0],(string)args[1]);
        return result != null;
    }
}

위 코드를 실행하면 결과는 다음과 같습니다.

위 내용은 C# 고급 프로그래밍 12장 동적 언어 확장의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.