Замок DynamicProxy2: получить цель внутри перехватчика? - PullRequest
2 голосов
/ 06 мая 2009

Я использую Castle DynamicProxy2 для "привязки" интерфейсов для извлечения полей из словаря. Например, учитывая следующий класс:

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

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

Я хочу использовать следующий интерфейс в качестве прокси интерфейса для извлечения значения «Name» из словаря Fields:

public interface IContrivedExample
{
    string Name { get; }
}

От перехватчика я хочу получить «целевой» DataContainer и вернуть значение «Имя»:

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");

Любые мысли о том, как получить основную цель

Примечание: это надуманный пример, который я использую, чтобы установить контекст вокруг моего вопроса.

Ответы [ 2 ]

2 голосов
/ 06 мая 2009

Я понял это. Вы должны привести Прокси к 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];
}
1 голос
/ 13 мая 2009

Почему хлопот?

использование

var container = invocation.InvocationTarget as DataContainer;

Кстати, IIUC, вы пытаетесь реализовать то, что уже предоставлено Castle DictionaryAdapter . Почему бы не использовать то, что уже есть?

...