まず、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 プロパティを動的に取得および設定します (興味がある場合は、サイト、バインダー、および動的オブジェクトの相互運用仕様を参照してください。終わらせる。)