C# Castle动态代理不工作?
我有以下课程:C# Castle动态代理不工作?,c#,.net,castle-dynamicproxy,C#,.net,Castle Dynamicproxy,我有以下课程: public class MyTest { public void Test() { } } 我创建了以下拦截器: public class MyInterceptor : IInterceptor { public void Intercept(IInvocation invocation) { invocation.Proceed(); } } 在我的代码中,我做到了: ProxyGener
public class MyTest
{
public void Test()
{
}
}
我创建了以下拦截器:
public class MyInterceptor : IInterceptor
{
public void Intercept(IInvocation invocation)
{
invocation.Proceed();
}
}
在我的代码中,我做到了:
ProxyGenerator g = new ProxyGenerator();
g.CreateClassProxy<MyTest>(new MyInterceptor());
MyTest t = new MyTest();
t.Test();
这不应该击中调试器中的拦截方法吗?事实并非如此。我错过什么了吗
编辑:这是特定于Castle DynamicProxy的。您必须将公共无效测试设置为公共虚拟无效测试,以便允许Castle DynamicProxy拦截该方法
动态代理是从类或对象生成子类的一种方法
其接口通常是一个模型。该子类覆盖每个
方法,它可以使您的方法成为虚拟的,以允许您这样做
有关Castle Dynamic Proxy的更多文档:
CreateClassProxy创建所谓的基于继承的代理。基于继承的代理是通过继承基类创建的。代理截取对类的虚拟成员的调用,并将它们转发给基实现。因此,只能截获类的虚拟成员。在您的示例中,您应该将测试方法标记为虚拟。看
复制您应该将测试方法标记为虚拟的;不使用任何代理,只创建一个新对象。var t=g.CreateClassProxynew MyInterceptor;-这将创建一个代理对象,所以接下来您可以调用它的方法:t.Test;可能重复的嗯。。。因此,如果我无法控制基类(它是一个.Net类),就无法钩住该方法?@SledgeHammer有一些技巧,但我没有尝试过。@SledgeHammer中描述的另一个选项
public class MyTest
{
public virtual void Test()
{
Console.WriteLine("Hi");
}
}
public class MyInterceptor : IInterceptor
{
public void Intercept(IInvocation invocation)
{
Console.WriteLine("Was here");
invocation.Proceed();
}
}
void Main()
{
ProxyGenerator g = new ProxyGenerator();
var t = g.CreateClassProxy<MyTest>(new MyInterceptor());
t.Test();
}