我到处读到.net 4 中的新 DLR,他们说反射是一个很好的用途,并且总是显示的代码片段类似于
dynamic d = GetSomeObject();
d.DoSomething();
d.SomeMember = 1;
GetSomeObject()
看起来像什么?我找不到任何地方可以解释这一点。
我知道它可以是任何东西,但在反思的背景下它是什么?是大会吗?一个类型的实例?
我到处读到.net 4 中的新 DLR,他们说反射是一个很好的用途,并且总是显示的代码片段类似于
dynamic d = GetSomeObject();
d.DoSomething();
d.SomeMember = 1;
GetSomeObject()
看起来像什么?我找不到任何地方可以解释这一点。
我知道它可以是任何东西,但在反思的背景下它是什么?是大会吗?一个类型的实例?
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,那么他们可以做更高级的事情。
您所描述的是dynamic
(还有其他方面)的鸭子打字方面。答案是它可以是任何东西:
IDynamicObject
)一个有用的例子(至少对于读取属性)可能是匿名类型;它也可以是 COM 对象,例如 - 或(在 Silverlight 中)html DOM 中的对象。或者它可能是您的供应商的Customer
对象,它没有实现任何通用接口,但与您自己的对象非常相似。哎呀,它可能是一个 IronPyton 对象。 InternalCustomer
好吧,GetSomeObject()
例如,可以返回一个 type 的实例_ComObject
。我认为这是拥有它的主要原因之一dynamic
。
我认为,就动态、DLR 和反射问题而言,看看第 2 行发生了什么会更有趣。
使用动态你像这样动态 d = GetSomeObject(); d.DoSomething();
而反射会更嘈杂
var d = GetSomeObject();
var mi = d.GetType().GetMethod("DoSomething");
mi.Invoke(d,mi);
正如我所看到的,第一个更优雅,我们正在谈论一种无参数的方法,当您与具有长签名方法的 COM 或 API 进行互操作时,事情会变得非常疯狂。我去过那儿 ;)