C# 使用Ninject展开截获的代理

C# 使用Ninject展开截获的代理,c#,proxy,ninject,interceptor,C#,Proxy,Ninject,Interceptor,我在Ninject中试验拦截器和动态代理,遇到了一种情况,我真的需要将类的代理实例“展开”到基实例。这可能吗?看起来应该很简单,但我找不到办法 这将成功调用拦截器: [MyInterceptorAttribute()] public virtual int MethodCall(int input) 但是我想找到并实例化属性出现的每个类的非代理版本: var methods = assembly.GetTypes() .SelectMany(t => t.GetM

我在Ninject中试验拦截器和动态代理,遇到了一种情况,我真的需要将类的代理实例“展开”到基实例。这可能吗?看起来应该很简单,但我找不到办法

这将成功调用拦截器:

[MyInterceptorAttribute()]
public virtual int MethodCall(int input)
但是我想找到并实例化属性出现的每个类的非代理版本:

var methods = assembly.GetTypes()
            .SelectMany(t => t.GetMethods())
            .Where(m => Attribute.IsDefined(m, typeof(MyInterceptorAttribute)))
            .ToList();

foreach(var method in methods) {
    // The proxied instance
    instance = kernel.Get(method.DeclaringType);
}

如何获取非代理实例?

据我所知,Ninject本身不提供访问代理目标的任何特定接口。对于某些类型的代理(类代理),这甚至是不可能的,因为代理实际上继承自代理类型,因此在访问代理时没有明显的区别


如果您将Ninject与castle dynamic proxy一起使用,请展示如何访问其他类型代理的代理类型的方法。

如果您可以访问激活上下文,则可以执行以下操作:

var reference= new InstanceReference()
        {
            Instance = yourWrappedObject
        };
new DynamicProxyProxyFactory(context.Kernel).Unwrap(context,reference);

return reference.Instance;

他们的解决方案是一个相当恶劣的黑客,但它的工作!谢谢:)