2

この投稿とリンクを読んだ後、まだ2つの質問があります

質問1

c# で動的コードを実行できるようにするための基準は何ですか? ターゲットクラス/オブジェクトは依存する必要があり ますか? つまり、誰かが私に Pascal DLL をくれた場合、そのコードを動的に使用することはできないと思います (または使用しますか?)..so: 動的に機能するための要件は何ですか?.net clr

質問2

例: スクリプト オブジェクト - int を増やすには、コードは次のようにする必要があります。

 Scriptobj.SetProperty("Count", ((int)GetProperty("Count")) + 1);

ダイナミックで私ができること:

scriptobj.Count += 1;

scriptobj のクラス プログラマーが、DLRを可能にするサポート コードを作成したということ=+1ですか?

ScriptobjClass : DynamicObject
{
  ...
  public override bool TryInvokeMember (...when +=1 so do a+1....)...
}

ここで重要な何かが欠けています。

クラスを作成していますが、.net DLR もアクセスできるようにする必要があります。そのため、 .net ユーザーが dlr を介してこのクラスにアクセスできるようにする操作もこのクラスがサポートするように、さらにコードを記述しましょう」 ?

4

1 に答える 1

3

まず、DLR で何ができるかを説明することから始めましょう。

DLR には 2 つの側面があります。1 つ目は、実行時にオブジェクトを動的にバインドできることです。例えば:

class A
{
    public int SomeProperty { get; set; }
}

class B
{
    public int SomeMethod(int value)
    {
        return value;
    }
}


dynamic d = new A();
d.Value = 1;

d = new B();
d.SomeMethod(2);

動的な d には、任意の型のオブジェクトを割り当てて、それらのメソッドとプロパティを呼び出すことができます。より印象的な例:

int CallSomeMethod(dynamic d)
{
    return d.SomeMethod();
}

これは、int を返すメソッド「SomeMethod」を持つすべてのクラスで機能します。これを行う強い型付けの方法は、"SomeMethod" を使用してインターフェイスを作成することです。

int CallSomeMethod(IClassWithSomeMethod d)
{
    return d.SomeMethod();
}

これは、以前はリフレクションで実行できなかったものではありませんが、DLR と dynamic キーワードを使用すると、これがはるかに簡単になることに注意してください。DLR は呼び出し用の式ツリーも作成してキャッシュするため、ほとんどの場合、DLR を使用する方がリフレクションよりも効率的です。

ただし、DLR の本当の強みは、ランタイム バインドだけではなく、実際に動的に動作するオブジェクトを作成できるようにすることです。基本的に、動的変数にバインドされた実際のランタイム オブジェクトに存在しないメソッドまたはプロパティを呼び出したときに何が起こるかを指定できます。これにより、CLR を動的言語に使用したり、動的言語との簡単な相互運用性を提供したり、DOM を動的オブジェクトとして表現できる使いやすいパーサーを作成したり、アドホック クエリをオブジェクトとして表現できる ORM を作成したりできます。

DLR の詳細については、そのcodeplex プロジェクトのドキュメント ページを参照してください。特に価値があるのは、概要サイト、バインダー、および動的オブジェクト相互運用仕様のドキュメントです。

今あなたの質問に:

質問 1: いいえ、動的言語と魔法でやり取りすることはできません。そのためには、サポートされている相互運用機能 (DLR によって促進される可能性があります) が必要です (Pascal dll の意味がわかりません)。

質問 2: ScriptObjectClass は、(DynamicObject を拡張することにより) DLR 機能を使用して、ScriptObjectClass の実際のプロパティであるかのように、Count プロパティを動的に取得および設定します (興味がある場合は、サイト、バインダー、および動的オブジェクトの相互運用仕様を参照してください。終わらせる。)

于 2012-12-19T00:39:50.600 に答える