سؤال

وأنا باستخدام قلعة 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 . لماذا لا تستخدم ما هو بالفعل هناك؟

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top