随着鸭子打字之类的介绍,如果我动态编写对象方法,除了扩展方法之外我会喜欢它。有谁知道这是否可能?我知道MS担心动态组成框架,但他们似乎在水中浸泡脚趾。
更新:感谢Pavel的澄清。例如,假设我从LINQ返回一个新的动态对象,并希望动态添加一些方法。
答案 0 :(得分: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
您也可以使用表达式树获得“动态方法”,一旦获得此类方法的委托,您还可以在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
可以在没有的情况下使用)。