Schloss DynamicProxy2: das Ziel innerhalb eines Interceptor erhalten?
-
05-07-2019 - |
Frage
Ich verwende Castle DynamicProxy2 zu „tack auf“ Schnittstellen Felder aus einem Wörterbuch abrufen. Zum Beispiel der folgende Klasse gegeben:
public class DataContainer : IDataContainer
{
private Dictionary<string, object> _Fields = null;
public Dictionary<string, object> Data
{
get { return _Fields ?? (_Fields = new Dictionary<string, object>()); }
}
}
Ich mag die folgende Schnittstelle als Schnittstelle Proxy verwenden, um den „Namen“ Wert aus dem Feld Wörterbuch zu extrahieren:
public interface IContrivedExample
{
string Name { get; }
}
Von Abfangjäger, ich will die „Ziel“ Datacontainer zu erhalten, und gibt den „Namen“ Wert:
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");
Alle Gedanken auf, wie das zugrunde liegende Ziel zu erhalten,
Hinweis: Dies ist ein konstruiertes Beispiel verwende ich einigen Kontext um die Frage zu schaffen Ich habe
.Lösung
ich es herausgefunden. Sie haben die Proxy IProxyTargetAccessor werfen:
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];
}
Andere Tipps
Warum der Aufwand?
Verwendung
var container = invocation.InvocationTarget as DataContainer;
BTW, IIUC, Sie versuchen, das umzusetzen, was bereits von