DLR和反思

时间:2009-12-30 20:35:14

标签: reflection .net-4.0 dynamic-language-runtime

我到处读到关于.net 4中新DLR的所有内容,他们说它很好用于反射,并且始终显示的代码片段类似于

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

GetSomeObject()看起来像什么?我无法找到解释这一点的任何地方。

我明白它可以是任何东西,但在反射的背景下它是什么?是集会吗?一个类型的实例?

4 个答案:

答案 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的鸭子打字方面(还有其他方面)。答案是它可以是任何东西:

  • true 动态对象(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时,事情会变得非常疯狂。我去过那里;)