Reflection DLR与反射

Reflection DLR与反射,reflection,.net-4.0,dynamic-language-runtime,Reflection,.net 4.0,Dynamic Language Runtime,每当我在.NET4中读到关于新DLR的文章时,他们都说反射是它的一个很好的用途,而经常显示的代码片段是这样的 dynamic d = GetSomeObject(); d.DoSomething(); d.SomeMember = 1; GetSomeObject()看起来像什么?我找不到任何地方可以解释这一点 我知道它可以是任何东西,但在反思的背景下,它是什么?是大会吗?类型的实例?例如,GetSomeObject()可以返回类型为\u-ComObject的实例。我认为这是动态的主要原因之一

每当我在.NET4中读到关于新DLR的文章时,他们都说反射是它的一个很好的用途,而经常显示的代码片段是这样的

dynamic d = GetSomeObject();
d.DoSomething();
d.SomeMember = 1;
GetSomeObject()
看起来像什么?我找不到任何地方可以解释这一点


我知道它可以是任何东西,但在反思的背景下,它是什么?是大会吗?类型的实例?

例如,
GetSomeObject()
可以返回类型为
\u-ComObject
的实例。我认为这是动态的主要原因之一。

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
时,当您调用方法或属性时(如您所示),编译器将生成使用反射尝试调用方法或属性的代码。如果它们存在,则调用将成功。如果没有,那么您将在运行时得到一个错误

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


话虽如此,如果客户或产品对象自己实现了IDynamicObject,那么他们可以做更高级的事情。

您所描述的是
动态的duck类型方面(还有其他方面)。答案是它可以是任何东西:

  • 真正的动态对象(
    IDynamiObject
  • 任何常规对象,通过反射

一个有用的例子(至少对于读取属性而言)可能是匿名类型;例如,它也可以是COM对象,或者(在Silverlight中)html DOM中的对象。或者,它可能是供应商的
Customer
对象,它没有实现任何公共接口,但与您自己的
InternalCustomer
对象非常相似。见鬼,它可能是一个IronPyton对象。

我认为更有趣的是,就动态、DLR和反射而言,看看第2行发生了什么

用dynmic你就这样 动态d=GetSomeObject(); d、 DoSomething()

而有反射的话,噪音会大一点

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

在我看来,第一种方法更为优雅,我们讨论的是一种无参数的方法,当您使用具有长签名方法的COM或API进行交互时,事情会变得非常疯狂。我去过那里;)

我知道它可以是任何东西。我更新了我的问题,使之更具体一些