Question

J'utilise Castle DynamicProxy2 pour "ajouter des pointes" et interfaces pour récupérer les champs d'un dictionnaire. Par exemple, étant donné la classe suivante:

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

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

Je souhaite utiliser l'interface suivante comme proxy d'interface pour extraire le " Nom " valeur du dictionnaire de champs:

public interface IContrivedExample
{
    string Name { get; }
}

À partir d'un intercepteur, je souhaite obtenir la "cible". DataContainer et renvoyez le " Nom " valeur:

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

Avez-vous des idées pour obtenir la cible sous-jacente

Remarque: il s'agit d'un exemple artificiel que j'utilise pour établir un contexte autour de la question que j'ai.

Était-ce utile?

La solution

Je l'ai compris. Vous devez convertir le proxy en 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];
}

Autres conseils

Pourquoi ces tracas?

utiliser

var container = invocation.InvocationTarget as DataContainer;

BTW, IIUC, vous essayez d'implémenter ce qui est déjà fourni par Castle DictionaryAdapter . Pourquoi ne pas utiliser ce qui existe déjà?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top