Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.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#_.net_Reflection_Methods_Typedescriptor - Fatal编程技术网

C# 以编程方式向类添加方法?

C# 以编程方式向类添加方法?,c#,.net,reflection,methods,typedescriptor,C#,.net,Reflection,Methods,Typedescriptor,我正在处理一个API,它有一百万个方法,我知道这些方法做什么,它们只是web服务的代理 API使用反射调用适当的方法名在内部调用这些代理方法(不要问我为什么这样做) web服务中有一些方法不是由API实现的,我需要动态地“注入”这些代理方法 所以我的问题是:如何向现有类添加方法(而不是扩展方法) 我可以这样做,但我不知道MSIL。 无论如何,我要提到它,因为我已经创建了另一个类,它继承自与API相同的基类,并在那里实现了方法,因此可能有一种方法可以将方法复制到API类,因为它们只调用引用同一个基

我正在处理一个API,它有一百万个方法,我知道这些方法做什么,它们只是web服务的代理

API使用反射调用适当的方法名在内部调用这些代理方法(不要问我为什么这样做)

web服务中有一些方法不是由API实现的,我需要动态地“注入”这些代理方法

所以我的问题是:如何向现有类添加方法(而不是扩展方法)

我可以这样做,但我不知道MSIL。

无论如何,我要提到它,因为我已经创建了另一个类,它继承自与API相同的基类,并在那里实现了方法,因此可能有一种方法可以将方法复制到API类,因为它们只调用引用同一个基类的方法。

在我看来,您也将使用反射,省去一些麻烦,并将该逻辑封装在扩展方法中(尽管您明确表示不这样做)


如果您有更多关于为什么扩展方法在这种情况下是一个坏主意的信息,或者为什么您想做API开发人员没有公开的事情,我可能会想出一些更有用的方法。

实际上,您不可能以您想要的方式修改现有类。即使使用Reflection.Emit,它也不会执行您想要的操作,因为API正在调用特定类型,并且您不能在运行时修改类型的定义。使用Reflection.Emit可以定义一个从代理继承的类型,但是让API加载继承的类型可能是不可能的,除非他们使用依赖项注入框架,这似乎不太可能

唯一真正做到这一点的方法是使用反编译和重新编译进入并修改dll的字节码。这就是Postsharp如何进行AOP的,但在我看来,我不会因为任何其他原因而这样做


如果您可以访问此代码或其库,那么可能有更好的方法解决您的问题。

为什么需要动态“注入”它们?你真的是说人们向你的外部API添加服务,你希望能够在不重新编译的情况下调用它们吗?@KirkWoll,他们提供的.NET API只覆盖了他们web API的一部分,我想添加一些方法来转换其他web部件,但每次调用都会通过该消息通过反射调用该类中的方法,所以我想这是唯一的选择,否则我将不得不重新编写整个API,这需要付出更多的努力。是的,我想注入方法。此外,我将创建一个函数来检查我的程序集(属性类等),并“注册所有应该注册的方法”。正如我所说,它们只是代理方法,很容易制作一个机器人来构建它们。我仍然不明白为什么在编译时知道完整的API时要动态添加方法。这对我来说毫无意义。这正是扩展方法设计的目的+1没有。API决定调用什么方法,而这个决定是由调用名(字符串)决定的,所以我看到的唯一选择是添加我的问题中描述的方法,扩展方法将不起作用。相反,API使您能够访问开发人员认为您应该能够访问的功能。其他任何东西都不是API。让我告诉你如何调用API中的代理方法,API使用反射来调用类型为X的方法X。那么你是说无论如何都不需要添加方法?我认为这是值得努力的,因为这是唯一的障碍,我已经看完了API的反编译代码。否则,我将不得不重写他们的整个API,它已经由无数个类构建而成。如果你的意思是为X类型添加一个方法,不幸的是,这在大多数(所有?)静态类型语言中是不可能的。在动态类型语言(如Javascript和Ruby.OK)中也称为monkey补丁。我想我找到了一种方法,我将继承那个代理类,我有一种方法告诉API使用我的代理类,我现在正在检查它。无论如何,谢谢你的输入!伟大的我很惊讶API如此灵活,因为它的设计如此奇怪,但这很好听。:(不…这是基本方法中的一条静态线,告诉API使用代理类X。我希望我能误导API使用继承API代理类的代理类。它正在改变单个
类型(X)
。。。