我到处读到关于.net 4中新DLR的所有内容,他们说它很好用于反射,并且始终显示的代码片段类似于
dynamic d = GetSomeObject();
d.DoSomething();
d.SomeMember = 1;
GetSomeObject()
看起来像什么?我无法找到解释这一点的任何地方。
我明白它可以是任何东西,但在反射的背景下它是什么?是集会吗?一个类型的实例?
答案 0 :(得分: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来尝试调用方法或属性的代码。如果存在则呼叫将成功。如果没有,那么你将在运行时收到错误。
在一般情况下,这个例子只是让编译器为你生成代码来简化Reflection的使用。
话虽如此,如果Customer或Product对象自己实现IDynamicObject,那么他们可以做更高级的东西。
答案 1 :(得分:1)
您所描述的是dynamic
的鸭子打字方面(还有其他方面)。答案是它可以是任何东西:
IDynamicObject
)一个有用的例子(至少用于读取属性)可能是匿名类型;它也可以是一个COM对象,例如 - 或者(在Silverlight中)html DOM中的一个对象。或者它可能是您的供应商的Customer
对象没有实现任何公共接口,但非常就像您的自己的 InternalCustomer
对象一样。哎呀,它可能是一个IronPyton对象。
答案 2 :(得分:0)
嗯,例如,GetSomeObject()
可以返回_ComObject
类型的实例。我认为这是获得dynamic
的主要原因之一。
答案 3 :(得分:0)
我认为就动态,DLR和反思问题而言,更有意思的是看看第2行发生了什么。
使用动态你就这样 dynamic d = GetSomeObject(); d.DoSomething();
虽然有反射但它有点嘈杂
var d = GetSomeObject();
var mi = d.GetType().GetMethod("DoSomething");
mi.Invoke(d,mi);
正如我所看到的,第一个更优雅,我们正在讨论一个参数少的方法,当你使用长签名方法插入COM或API时,事情会变得非常疯狂。我去过那里;)