ما هو اقصر الطرق لتنفيذ وكيل أو الطبقة الديكور في ج #؟

StackOverflow https://stackoverflow.com/questions/508110

سؤال

وعندما يكون لديك سيارة الفئة التي تطبق IVehicle وتريد التفاف عليه في الديكور الذي يقوم بإعادة توجيه كافة المكالمات إلى السيارة والتهم لهم، كيف يمكنك أن تفعل ذلك؟

في روبي أنا فقط يمكن بناء الديكور دون أي الأساليب واستخدام method_missing لإعادة توجيه كافة المكالمات إلى كائن السيارة.

في جاوة أتمكن من بناء كائن وكيل التي تدير كافة التعليمات البرمجية من خلال أسلوب واحد ويحيله بعد ذلك.

هل هناك أي شيء يمكنني القيام به مماثلة وفي C #؟


تحديث:

وبناء على ما جاءت الإجابة ولقد قرأت عن System.Reflection.Emit أنه ينبغي أن يكون من الممكن لكتابة مماثلة طريقة لهذه:

Type proxyBuilder(Type someType, delagate functionToBeApplied, Object forward)

حيث نوع ينفذ كل واجهة من someType، تنفيذ functionToBeApplied ومن ثم توجيه استدعاء الأسلوب في الاعتراض اثناء عودته عودتها.

هل هناك بعض ليب ان يفعل ذلك بالضبط أو أن لدي لكتابة بلدي؟

هل كانت مفيدة؟

المحلول

لإنشاء وكلاء هل يمكن أن ننظر إلى "RealProxy" إذا كنت ترغب في استخدام أنواع القياسية، انها قليلا من المتاعب لاستخدام على الرغم من (ويتطلب الفصول الدراسية ترث من MarshalByRefObject).

public class TestProxy<T> : RealProxy where T : class
{
    public T Instance { get { return (T)GetTransparentProxy(); } }
    private readonly MarshalByRefObject refObject;
    private readonly string uri;

    public TestProxy() : base(typeof(T))
    {
        refObject = (MarshalByRefObject)Activator.CreateInstance(typeof(T));
        var objRef = RemotingServices.Marshal(refObject);
        uri = objRef.URI;
    }

    // You can find more info on what can be done in here off MSDN.
    public override IMessage Invoke(IMessage message)
    {
        Console.WriteLine("Invoke!");
        message.Properties["__Uri"] = uri;
        return ChannelServices.SyncDispatchMessage(message);
    }
}

وبدلا من ذلك يمكن أن تحصل "DynamicProxy" من قلعة .. أنه يعمل بشكل أفضل قليلا في تجربتي ..

إذا كنت تستخدم واحدة من تلك التي سوف يست بالضرورة الحصول على أداء رائعا على الرغم من أنني استخدامها في المقام الأول في المكالمات التي من المرجح أن تكون بطيئة في المقام الأول .. ولكن هل يمكن تجربتها إذا كنت تريد.

وحل مارك سوف يكون الأداء أفضل.

نصائح أخرى

ولسوء الحظ، لا يوجد أي دعم mixin في C #. لذلك كنت بحاجة إلى تنفيذ جميع الأساليب، أو استخدام بعض reflection.emit الثقيلة للقيام بذلك. البديل الآخر هو (اختياري) فئة وكيل / قاعدة الديكور ...

abstract class FooBase : IFoo {
   protected FooBase(IFoo next) {this.next = next;}
   private readonly IFoo next;
   public virtual void Bar() { // one of the interface methods
       next.Bar();
   }
   public virtual int Blop() { // one of the interface methods
       return next.Blop();
   }
   // etc
}

ثم

class SomeFoo : FooBase {
   public SomeFoo(IFoo next) : base(next) {}
   public override void Bar() {...}
}

وولاحظ أن استخدام FooBase اختياري بدقة. يسمح أي IFoo.

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