【发布时间】:2014-06-09 06:13:04
【问题描述】:
所以我的程序集中有一个简单的类:
public class MyCalculator
{
public int Sum(params int[] nums)
{
Console.WriteLine("Summing");
return nums.Sum();
}
}
首先要知道的是 Sum 方法不是虚拟的。我不想要这个限制。
我想“覆盖”Sum 方法以在运行时注入一些代码。 (就像任何动态代理框架一样。/例如:Castle/)
我创建了一个虚拟方法(只是相关部分):
MethodBuilder sumBuilder = myCalculatorProxyType.DefineMethod(myCalculatorSum.Name,
MethodAttributes.Public |
MethodAttributes.ReuseSlot |
MethodAttributes.HideBySig |
MethodAttributes.SpecialName |
MethodAttributes.Virtual |
MethodAttributes.Final,
CallingConventions.Standard,
myCalculatorSum.ReturnType,
myCalculatorSum.GetParameters().Select(pi => pi.ParameterType).ToArray());
最后我尝试“覆盖”它:
myCalculatorProxyType.DefineMethodOverride(sumBuilder,myCalculatorSum);
我玩了三个可能的选项:
MethodAttributes- 召唤约定
- 还有
DefineMethodOverride方法
我的概念:让方法Public明显和HideBySig。在 vtable 中附加 ReuseSlot 并使用 ExplicitThis 调用它。
知道如何实现这一目标吗?还是需要一些更讨厌的东西?
我知道外面有框架,但我想了解这个的概念。
【问题讨论】:
-
您不能覆盖非虚拟。 AFAIK,Castle 也做不到。像 PostSharp 这样的东西可以,但它通过实际更改编译的程序集来工作,而不是创建新的派生类型。
-
可能重复link
-
@svick:你是对的。继承代理仅支持城堡中的虚拟成员。但我的基本想法是 IL 比 C# 了解更多。 (例如没有类的主要方法:))
-
@SargisKoshkaryan:链接的帖子是关于 C# 而不是 IL
标签: .net dynamic overriding cil reflection.emit