Frage

Wenn Sie eine Klasse Auto, das IVehicle implementiert und Sie wollen es in einem Dekorateur wickeln, die alle Anrufe an Auto leitet und zählt sie, wie würden Sie es tun?

In Ruby konnte ich nur einen Dekorateur ohne Methoden bauen und verwenden method_missing alle Anrufe an das Auto-Objekt zu übermitteln.

In Java Ich könnte ein Proxy-Objekt erstellen, das die gesamten Code durch ein Verfahren läuft und leitet sie anschließend.

Gibt es ein ähnlich, was ich in C # tun?


Update:

auf der Grundlage der answeres und was Ich habe gelesen, über System.Reflection.Emit sollte es möglich sein, ein Verfahren ähnlich zu, dies zu schreiben:

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

, wobei alle Schnittstellentypen von sometype implementiert, führen functionToBeApplied und leitet dann den Methodenaufruf an dem Objekt während seiner Rückkehr zurückkehrt.

Gibt es eine lib die genau das tut oder würde ich meine eigene schreiben?

War es hilfreich?

Lösung

Für Proxying Sie in „Realproxy“ aussehen könnte, wenn Sie Standardtypen verwenden möchten, ist es ein wenig umständlich, obwohl zu verwenden (und es erfordert Ihre Klassen von MarshalByRefObject erben).

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);
    }
}

Alternativ können Sie „Dynamic“ von Castle bekommen .. Es funktioniert ein wenig besser in meiner Erfahrung ..

Wenn Sie einen von denen verwenden, werden Sie müssen nicht zwangsläufig große Leistung, obwohl, ich benutze sich in erster Linie in Anrufen, die wahrscheinlich in erster Linie langsam sein .. Aber man könnte es ausprobieren, wenn Sie wollen.

Marc-Lösung wird eine bessere Leistung haben.

Andere Tipps

Leider gibt es keine mixin Unterstützung in C #. So müssen Sie alle Methoden implementieren, oder verwenden Sie einige schweren Reflection.Emit es zu tun. Die andere Alternative ist eine (optional) proxy / Dekorateur Basisklasse ...

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
}

dann

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

Anbetracht dessen, dass die Verwendung des FooBase streng optional ist; jede IFoo erlaubt ist.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top