target - 城堡动态代理2 : Get the Target inside an Interceptor?

标签 target castle-dynamicproxy iinterceptor

我正在使用 CaSTLe DynamicProxy2“附加”接口(interface)以从字典中检索字段。例如,给定以下类:

public class DataContainer : IDataContainer
{
    private Dictionary<string, object> _Fields = null;

    public Dictionary<string, object> Data
    {
        get { return _Fields ?? (_Fields = new Dictionary<string, object>()); }
    }
}

我想使用以下接口(interface)作为接口(interface)代理来从 Fields 字典中提取“Name”值:

public interface IContrivedExample
{
    string Name { get; }
}

从拦截器中,我想获取“目标”DataContainer,并返回“Name”值:

public void Intercept(IInvocation invocation)
{
    object fieldName = omitted; // get field name based on invocation information

    DataContainer container = ???; // this is what I'm trying to figure out
    invocation.ReturnValue = container.Fields[fieldName];
}

// Somewhere in code
var c = new DataContainer();
c.Fields.Add("Name", "Jordan");

var pg = new ProxyGenerator();
IContrivedExample ice = (IContrivedExample) pg.CreateInterfaceProxyWithTarget(..., c, ...);
Debug.Assert(ice.Name == "Jordan");

关于如何获得潜在目标的任何想法

注意:这是一个人为的示例,我用它来围绕我的问题建立一些上下文。

最佳答案

我明白了。您必须将代理强制转换为 IProxyTargetAccessor:

public void Intercept(IInvocation invocation)
{
    object fieldName = omitted; // get field name based on invocation information

    var accessor = invocation.Proxy as IProxyTargetAccessor;

    DataContainer container = (DataContainer) accessor.DynProxyGetTarget();
    invocation.ReturnValue = container.Fields[fieldName];
}

关于target - 城堡动态代理2 : Get the Target inside an Interceptor?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/826673/

相关文章:

javascript - PhpStorm 给出奇怪的消息

iphone - 与 iphone SDK 的版本兼容性。 tar 使用更高版本的 sdk 获取旧版本的 sdk

xcode - 在 Xcode 中禁用测试目标

c# - DispatchProxy 与 CaSTLe DynamicProxy 相比如何?

c# - 使用 CaSTLe Fluent Interface 注册拦截器

javascript - 在CKEditor中,如何在删除目标选项卡的同时将链接设置为默认在新窗口中打开?

c# - CaSTLe 接口(interface)的动态代理而不是派生类

Autofac 使用带有 WcfIntegration 的 DynamicProxy2 拦截

database - NHibernate IInterceptor 实现(将属性添加到原始域类没有的数据库表)

c# - 如何在CaSTLe.Core中实现IProxyGenerationHook的类中实现Equals和GetHashCode的重写方法?