C#4.0,方法在飞?

Tre*_*ent 5 c#-4.0

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

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

Pav*_*aev 11

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

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
Run Code Online (Sandbox Code Playgroud)

你也可以使用表达式树来获得"动态方法",一旦你获得了这种方法的委托,你也可以在它上面创建一个类似于可调用方法的属性ExpandoObject.

不幸的是,为了在LINQ查询中使用,你不能使用对象初始化器ExpandoObject; 在最简单的情况下,以下将无法编译:

var foo =  new ExpandoObject { Bar = 123; }
Run Code Online (Sandbox Code Playgroud)

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

public static dynamic With(this ExpandoObject o, Action<dynamic> init)
{
     init(o);
     return o;
}
Run Code Online (Sandbox Code Playgroud)

现在您可以使用它:

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