Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 是否可以在运行时向现有类添加方法?为什么?_C#_Dynamic_Reflection.emit - Fatal编程技术网

C# 是否可以在运行时向现有类添加方法?为什么?

C# 是否可以在运行时向现有类添加方法?为什么?,c#,dynamic,reflection.emit,C#,Dynamic,Reflection.emit,我想这可能需要反射。发射 但只回答如何动态创建类/方法,而不回答如何更新现有类 同样,是否可以在运行时删除方法/类?如果是这样,我想我们可以删除这个类,然后用它的旧方法加上新方法将它添加回来 提前谢谢 顺便说一句,我没有这个用途,只是好奇而已 是否可以在运行时删除方法/类 假设这是可能的。对这些方法的调用将失败并产生未定义(但通常是灾难性的)行为 所以我确信这是不可能的。在常规的C#/.NET中,答案是简单的“不”。您最多只能编写一个DynamicMethod,它可以像那种类型的方法一样运行(访

我想这可能需要反射。发射

但只回答如何动态创建类/方法,而不回答如何更新现有类

同样,是否可以在运行时删除方法/类?如果是这样,我想我们可以删除这个类,然后用它的旧方法加上新方法将它添加回来

提前谢谢

顺便说一句,我没有这个用途,只是好奇而已

是否可以在运行时删除方法/类

假设这是可能的。对这些方法的调用将失败并产生未定义(但通常是灾难性的)行为

所以我确信这是不可能的。

在常规的C#/.NET中,答案是简单的“不”。您最多只能编写一个
DynamicMethod
,它可以像那种类型的方法一样运行(访问私有字段等),但它永远不会出现在API上-您只需要使用一个委托即可

如果您使用
dynamic
,您几乎可以做任何您想做的事情。通过附加委托来代替方法,您可以使用
ExpandoObject
模拟这种情况,但在自定义动态类型上,您可以做大多数事情,但这只影响使用
dynamic
API的调用方。对于基本的
ExpandoObject
示例:

dynamic obj = new ExpandoObject();
Func<int, int> func = x => 2*x;
obj.Foo = func;
int i = obj.Foo(123); // now you see it
obj.Foo = null; // now you don't
dynamic obj=new ExpandoObject();
Func Func=x=>2*x;
对象Foo=func;
int i=obj.Foo(123);//现在你看到了
obj.Foo=null;//现在你不知道了
对于属性和事件(而不是方法),可以使用
System.ComponentModel
方法更改运行时显示的内容,但这只会影响通过
System.ComponentModel
访问的调用方,这主要意味着:UI数据绑定。这就是
DataTable
将列表示为伪属性的方式(暂时忘记“类型化数据集”——它在没有这些属性的情况下工作)

为了完整性,我还应该提到扩展方法。这更多的是一个编译器技巧,而不是运行时技巧——但有点允许您为“add”的小值向现有类型添加方法


最后一个技巧是动态地子类类型,并在子类中提供额外的功能。例如,重写属性以拦截它们(延迟加载等)。

未定义通常意味着灾难性的!;)捕获(未定义方法/未定义类异常)?:-P@user420667有
MissingMethodException
TypeLoadException
。当您针对程序集的一个版本生成代码,然后针对另一个版本运行代码时,可能会发生这种情况,因为另一个版本缺少方法或类型。仅仅因为它可能导致运行时错误并不意味着这就是无法执行此操作的原因。使用dynamic可以进入DLR领域,因此MissingMethodException将在运行时抛出,而不是在编译时抛出。这是一个完美的例子,说明了为什么每个帖子只包含一个问题。马克和亨克分别回答了你提出的一个单独的问题,而且都是正确的好答案。你选择哪一个作为正确的选择并接受?请在每篇文章中只回答一个问题,以避免出现这样的情况:一个回复者得到奖励,另一个没有,即使两个答案都是好的、正确的,并且回答了您的问题。好的。我以后会尽量记住这一点。问题而非方法/对象的单一目的原则。现在契约已经完成了,我可能不应该改变它。哈哈,“为了小价值的增加”。我猜这意味着静态方法:-P@user420667不,实际上我的意思是“它们不是类型上的真正方法”。回答得很好。关于为什么呢?它会打破某种发展原则/难以实施吗?