随着类似鸭子类型的引入,我希望能够在扩展方法之外动态地组合对象方法。有人知道这是否可能吗?我知道微软担心动态地组合框架,但他们似乎正在试水。
更新:感谢Pavel的澄清。例如,假设我从LINQ返回一个新的动态对象,并希望动态地添加一些方法。
随着类似鸭子类型的引入,我希望能够在扩展方法之外动态地组合对象方法。有人知道这是否可能吗?我知道微软担心动态地组合框架,但他们似乎正在试水。
更新:感谢Pavel的澄清。例如,假设我从LINQ返回一个新的动态对象,并希望动态地添加一些方法。
根据更新后的答案,您实际上并不需要"动态方法",更多的是需要"动态对象"——这样您可以在运行时添加新属性和方法。如果是这样的话,在.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
上创建一个可调用的类似方法的属性。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; };
});
new
后未指定类的 new { ... }
创建)不是可扩展类型。有关详细信息,请查看编辑后的答案。 - Pavel Minaev借助 DynamicMethod
和/或 MethodBuilder
已经可以实现这一点。虽然它已经存在一段时间了,但不确定是否算得上 "担心",因为在大多数情况下需要动态程序集 (尽管可以在没有动态程序集的情况下使用 DynamicMethod
)。