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.
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