ホームページ  >  記事  >  バックエンド開発  >  C# 高度なプログラミング 第 12 章 動的言語拡張

C# 高度なプログラミング 第 12 章 動的言語拡張

大家讲道理
大家讲道理オリジナル
2017-04-11 14:05:592258ブラウズ

(1) DLR

C#4の動的関数は、DynamicLanguage Runtime(動的言語ランタイム、)です。 DLR) の一部。 DLRは、CLRに追加されたサービスのセットです。

(2)dynamic

dynamic型を使用すると、コンパイル時に型チェックを無視するコードを書くことができます。コンパイラーは、dynamic 型の オブジェクト に対して定義された操作はすべて有効であると想定し、実行前にエラーをチェックしません。

例:


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

これらの 2 行のコードはコンパイラによってコンパイルできますが、[実行] をクリックするとエラーが報告されます:

dynamic タイプは非常に便利ですが、それには代償が伴います。

(3)DLR ScriptRuntime が含まれています

スクリプト編集機能をアプリケーションに追加し、スクリプトに値を渡したり、スクリプトから値を渡したりして、アプリケーションがスクリプトを使用してスクリプトを完了できるようにします。仕事。

(4) DynamicObject と ExpandoObject

DynamicObject から派生するか、ExpandoObject を使用して独自の動的オブジェクトを作成できます。

DynamicObject 派生を使用して動的オブジェクトを作成するには、TrySetMembe()、TryGetMember()、および TryInvokeMember() の 3 つのメソッドをオーバーライドする必要があります。

派生に 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 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。