2009-05-05 16 views
2

J'utilise Castle DynamicProxy2 pour "coller" des interfaces pour extraire des champs d'un dictionnaire. Par exemple, compte tenu de la classe suivante:Castle DynamicProxy2: Obtenir la cible dans un intercepteur?

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

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

Je veux utiliser l'interface suivante en tant que proxy d'interface pour extraire la valeur « Nom » du dictionnaire Fields:

public interface IContrivedExample 
{ 
    string Name { get; } 
} 

D'un intercepteur, Je veux obtenir la « cible » DataContainer et retourner la valeur « Nom »:

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

Toute réflexion sur la façon d'obtenir la cible sous-jacente

Note: ceci est un exemple artificiel que j'utilise pour établir un certain contexte autour de la question que j'ai.

Répondre

2

Je l'ai compris. Vous devez lancer le Proxy 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

Pourquoi les tracas?

utilisation

var container = invocation.InvocationTarget as DataContainer; 

BTW, IIUC, vous essayez de mettre en œuvre ce qui est déjà fourni par Castle DictionaryAdapter. Pourquoi ne pas utiliser ce qui existe déjà?

+0

Initialement, j'ai essayé de lancer InvocationTarget en tant que DataContainer et cela n'a pas fonctionné. C'est ce qui m'a conduit à utiliser IProxyTargetAccessor. Comme pour le DictionaryAdapter 1) Je ne savais pas qu'il existait et 2) J'ai d'autres propriétés sur le "DataContainer" que juste des champs. J'en ai parlé parce que ce n'était pas pertinent à la question que je posais. Merci! – Jordan