3

.net 4の新しいDLRについて読んだところはどこでも、それの良い使い方はリフレクションであり、常に表示されるコードスニペットは次のようなものだと言われています。

dynamic d = GetSomeObject();
d.DoSomething();
d.SomeMember = 1;

どのようにGetSomeObject()見えますか?それを説明するところはどこにも見つかりません。

私はそれが何でもあり得ることを理解していますが、反省の文脈ではそれは何ですか?アセンブリですか?タイプのインスタンス?

4

4 に答える 4

3

GetSomeObject() の戻り値の型は、何らかの型のインスタンスになります。たとえば、次のようになります。

public Customer GetSomeObject() {
    return new Customer("John", "Doe", 12345);
}

そして、コードは次のようになります。

dynamic customer = GetSomeObject();
string s = customer.FirstName;
// now the "s" variable would have "John" in it

GetSomeObject()何でも返すことができます。Customer オブジェクトまたは Product を返す場合があります。そして、それは問題ではありません!アイデアは、変数がdynamicメソッドまたはプロパティを呼び出すときに変数が宣言されている場合、コンパイラはリフレクションを使用してメソッドまたはプロパティを呼び出しようとするコードを生成するということです。それらが存在する場合、呼び出しは成功します。そうしないと、実行時にエラーが発生します。

一般的なケースでは、この例は、コンパイラにコードを生成させることにより、Reflection の使用を単純化しています。

そうは言っても、Customer オブジェクトまたは Product オブジェクトが IDynamicObject 自体を実装している場合は、はるかに高度な処理を行うことができます。

于 2009-12-30T20:38:40.507 に答える
1

あなたが説明しているのは、ダックタイピングの側面ですdynamic(他の側面があります)。答えは、何でもかまいません。

  • 真の動的オブジェクト ( IDynamicObject)
  • リフレクションによる通常のオブジェクト

(少なくともプロパティを読み取るための) 有用な例は、匿名型です。たとえば、COM オブジェクト、または (Silverlight では) html DOM 内のオブジェクトの場合もあります。Customerまたは、共通のインターフェイスを実装していないベンダーのオブジェクトである可能性がありますが、独自のオブジェクトに非常に似ています。一体、それは IronPyton オブジェクトである可能性があります。 InternalCustomer

于 2009-12-30T20:39:04.417 に答える
0

たとえば、GetSomeObject()type のインスタンスを返すことができます_ComObject。それがそれを持っている主な理由の1つdynamicだと思います。

于 2009-12-30T20:38:38.447 に答える
0

動的、DLR、およびリフレクションに関する限り、たとえば 2 行目で何が起こったのかを確認する方が興味深いと思います。

動的を使用すると、この動的 d = GetSomeObject(); のようになります。d.DoSomething();

反射があると少しうるさいです

var d = GetSomeObject();
var mi = d.GetType().GetMethod("DoSomething");
mi.Invoke(d,mi);

私が見ているように、最初のものはより洗練されており、引数のないメソッドについて話しているのですが、長い署名メソッドを持つ COM または API と相互運用している場合、事態は非常に狂ってしまう可能性があります。私はそこにいました;)

于 2012-05-03T19:09:46.050 に答える