Pergunta

Eu estou usando Castelo DynamicProxy2 para "tack on" interfaces para recuperar campos de um dicionário. Por exemplo, dada a seguinte classe:

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

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

Eu quero usar a seguinte interface como um proxy interface para extrair o valor "Nome" fora do dicionário Fields:

public interface IContrivedExample
{
    string Name { get; }
}

A partir de um interceptor, eu quero começar o DataContainer "alvo", e retornar o valor "Nome":

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

Quaisquer pensamentos sobre como obter a meta subjacente

Nota: este é um exemplo artificial que estou usando para estabelecer algum contexto em torno da pergunta que eu tenho

.
Foi útil?

Solução

Eu percebi isso. Você tem que lançar o Proxy para 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];
}

Outras dicas

Por que o incômodo?

uso

var container = invocation.InvocationTarget as DataContainer;

BTW, IIUC, você está tentando implementar o que já é fornecido por Castelo DictionaryAdapter . Por que não usar o que já está lá fora?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top