القلعة DynamicProxy2: الحصول على الهدف داخل المعترض؟
-
05-07-2019 - |
سؤال
وأنا باستخدام قلعة DynamicProxy2 إلى "تك" واجهات لاسترداد حقول من القاموس. على سبيل المثال، وبالنظر إلى الطبقة التالية:
public class DataContainer : IDataContainer
{
private Dictionary<string, object> _Fields = null;
public Dictionary<string, object> Data
{
get { return _Fields ?? (_Fields = new Dictionary<string, object>()); }
}
}
وأريد أن استخدام واجهة التالية كما وكيل واجهة لاستخراج "الاسم" قيمة من القاموس الحقول:
public interface IContrivedExample
{
string Name { get; }
}
ومن اعتراضي، وترغب في الحصول على "الهدف" DataContainer، والعودة إلى "الاسم" قيمة:
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");
وأية أفكار عن كيفية الحصول على الهدف الأساسي
ملحوظة: هذا هو مثال مفتعلة أنا باستخدام لإقامة بعض السياق حول مسألة لدي
.المحلول
وأنا أحسب من ذلك. عليك أن يلقي وكيل ل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];
}
نصائح أخرى
لماذا مشاحنات؟
استخدم
var container = invocation.InvocationTarget as DataContainer;
وراجع للشغل، IIUC، كنت في محاولة لتنفيذ ما يتم توفيرها بالفعل من قبل <وأ href = "https://github.com/castleproject/Core/blob/master/docs/dictionaryadapter.md" يختلط = "نوفولو noreferrer "> قلعة DictionaryAdapter . لماذا لا تستخدم ما هو بالفعل هناك؟