这里是类:
class Foo
{
private void Boo()
{
// Body...
}
// Other members...
}
我需要的是:
- 创建
Foo2
运行时类,它拥有所有的副本Foo
类成员。 - 在
Foo2
类替换Boo
通过方法Boo2
具有交替以在一定程度上它的内容的方法。 - 创建的实例
Foo2
并调用Boo2
。
谢谢你的帮助。
这里是类:
class Foo
{
private void Boo()
{
// Body...
}
// Other members...
}
我需要的是:
Foo2
运行时类,它拥有所有的副本Foo
类成员。 Foo2
类替换Boo
通过方法Boo2
具有交替以在一定程度上它的内容的方法。 Foo2
并调用Boo2
。 谢谢你的帮助。
您可以使用.NET AOP框架事件如果不是这种架构的主要目的在运行时做到这一点。
我在一个新的可以处理它的事件,如果你的方法是不是虚拟的积极努力。
您可以一看NConcern .NET运行时AOP框架
猴子补丁“方面”:
public class MonkeyPatch : IAspect
{
static public void Patch(MethodInfo oldMethod, MethodInfo newMethod)
{
//update monkey patch dictionary
MonkeyPatch.m_Dictionary[oldMethod] = newMethod;
//release previous monkey patch for target method.
Aspect.Release<MonkeyPatch>(oldMethod);
//weave monkey patch for target method.
Aspect.Weave<MonkeyPatch>(oldMethod);
}
static private Dictionary<MethodInfo, MethodInfo> m_Dictionary = new Dictionary<MethodInfo, MethodInfo>();
public IEnumerable<IAdvice> Advise(MethodInfo method)
{
if (MonkeyPatch.m_Dictionary.ContainsKey(_Method))
{
yield return Advice(MonkeyPatch.m_Dictionary[_Method]);
}
}
}
补丁:
static public void main(string[] args)
{
//create Boo2, a dynamic method with Boo signature.
var boo2 = new DynamicMethod("Boo2", typeof(void), new Type[] { typeof(Foo) }, typeof(Foo), true);
var body = boo2.GetILGenerator();
//Fill your ILGenerator...
body.Emit(OpCodes.Ret);
//Apply the patch
MonkeyPatch.Patch(typeof(Foo).GetMethod("Boo"), boo2);
}
在第二另一方面,如果你只需要原来的电话后打电话到的东西,你是在AOP目的,你可以做这样的...
观察看点:
public class Observation : IAspect
{
static public void Observe(MethodInfo method, Action action)
{
//update observation dictionary
Observation.m_Dictionary[method] = action;
//release observation aspect for target method
Aspect.Release<Observation>(method);
//weave observation aspect for target method.
Aspect.Weave<Observation>(method);
}
static private Dictionary<MethodInfo, Action> m_Dictionary = new Dictionary<MethodInfo, Action>;
public IEnumerable<IAdvice> Advice(MethodInfo method)
{
if (Observation.m_Dictionary.ContainsKey(method))
{
yield return Advice.Basic.After(Observation.m_Dictionary[method]);
}
}
}
使用案例:
static public void main(string[] args)
{
Observation.Observe(typeof(Foo).GetMethod("Boo"), () => { /* paste here your notification code... */ });
}