gpt4 book ai didi

c#-4.0 - C# 4.0,动态方法?

转载 作者:行者123 更新时间:2023-12-03 06:38:38 27 4
gpt4 key购买 nike

随着鸭子类型之类的东西的引入,除了扩展方法之外,如果我动态地编写对象方法,我会很高兴。有人知道这是否可能吗?我知道 MS 担心即时构建框架,但他们似乎正在尝试。

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

最佳答案

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

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

您也可以通过表达式树拥有“动态方法”,一旦获得此类方法的委托(delegate),您还可以在 ExpandoObject 上创建一个可调用的类似方法的属性.

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

var foo =  new ExpandoObject { Bar = 123; }

原因是本例中的 Bar 将作为 ExpandoObject 的属性进行静态查找。您需要接收器是动态才能启动此功能,并且无法使其位于对象初始值设定项内。作为在 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; };
});

关于c#-4.0 - C# 4.0,动态方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1662764/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com