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()可以返回任何东西。它可能返回一个客户对象或一个产品。而且没关系!这个想法是,当变量被声明为dynamic调用方法或属性时,如您所展示的,编译器将生成使用反射来尝试调用方法或属性的代码。如果它们存在,那么调用将成功。如果不是,那么您将在运行时收到错误消息。

在一般情况下,此示例只是通过让编译器为您生成代码来简化反射的使用。

话虽如此,如果 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。我认为这是拥有它的主要原因之一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 回答