C#4.0,方法在飞?

时间:2009-11-02 18:06:01

标签: c#-4.0

随着鸭子打字之类的介绍,如果我动态编写对象方法,除了扩展方法之外我会喜欢它。有谁知道这是否可能?我知道MS担心动态组成框架,但他们似乎在水中浸泡脚趾。

更新:感谢Pavel的澄清。例如,假设我从LINQ返回一个新的动态对象,并希望动态添加一些方法。

3 个答案:

答案 0 :(得分:11)

根据更新的答案,您实际上并不是在寻找“动态方法”,而是“动态对象” - 这样您就可以在运行时向它们添加新的属性和方法。如果这是正确的,那么在.NET 4.0中,您可以将ExpandoObjectdynamic结合使用:

dynamic foo = new ExpandoObject();
foo.Bar = 123; // creates a new property on the fly
int x = foo.Bar; // 123

// add a new method (well, a delegate property, but it's callable as method)
foo.Baz = (Func<int, int, int>)
    delegate(int x, int y)
    {
        return x + y;
    };

foo.Baz(1, 2); // 3

您也可以使用表达式树获得“动态方法”,一旦获得此类方法的委托,您还可以在ExpandoObject上创建一个类似于可调用方法的属性。

不幸的是,为了在LINQ查询中使用,您不能将对象初始值设定项与ExpandoObject一起使用;在最简单的情况下,以下内容将无法编译:

var foo =  new ExpandoObject { Bar = 123; }

原因是在这种情况下Bar将被静态查找为ExpandoObject的属性。您需要接收器dynamic才能启动此功能,并且无法在对象初始化程序中进行此操作。作为在LINQ中使用的变通方法,请考虑此辅助扩展方法:

public static dynamic With(this ExpandoObject o, Action<dynamic> init)
{
     init(o);
     return o;
}

现在你可以这样使用它:

from x in xs
select new ExpandoObject().With(o => {
    o.Foo = x;
    o.Bar = (Func<int, int>)delegate(int y) { return x + y; };
});

答案 1 :(得分:2)

答案 2 :(得分:1)

借助DynamicMethod和/或MethodBuilder,这已经成为可能。不确定是否因为它已经存在了一段时间而感到“担心”,尽管它在大多数情况下需要动态组装(DynamicMethod可以在没有的情况下使用)。