2010-05-28 18 views
5

Ich suche nach einer Möglichkeit, einen generischen Wrapper für jedes Objekt zu erstellen.
Das Wrapper-Objekt verhält sich genau wie die Klasse, die es umschließt, kann aber mehr Eigenschaften, Variablen, Methoden usw. für z. Objektzählung, caching usw.C# -Wrapper für Objekte

Say die Hüllklasse Wrapper, und die Klasse zu umhüllenden heißen Platz genannt und hat den Konstruktor Platz (double edge_len) und die Eigenschaften/Methoden Kantenlängengrße und Gebiet, würde ich mag es, wie folgt verwenden:

Wrapper<Square> mySquare = new Wrapper<Square>(2.5); /* or */ new Square(2.5); 
Console.Write("Edge {0} -> Area {1}", mySquare.EdgeLength, mySquare.Area); 

Natürlich kann ich schaffen, eine solche Wrapper-Klasse für jede Klasse I wickeln will, aber ich bin für eine allgemeine Lösung, i. B. Wrapper<T>, das sowohl primitive als auch zusammengesetzte Typen verarbeiten kann (obwohl ich in meiner jetzigen Situation glücklich wäre, wenn ich nur meine eigenen Klassen verpacke).

Vorschläge?

Danke.

+0

Sie können dies nicht mit C# bis zu 3.0 tun. In Version 4.0 können Sie dies jedoch über das neue dynamische System tun. –

+0

Könnten Sie bitte ausarbeiten? Vielen Dank. – Haggai

Antwort

2

DynamicProxy vom Schloss-Projekt könnte die Lösung für Sie sein.

+1

+1, ja - die Frage ist eindeutig auf der Suche nach einer Proxy-Implementierung. DynamicProxy ist in der Open Source-Welt von .NET weit verbreitet (NMock2, NHibernate, Ninject, etc.). Der einzige wichtige Vorbehalt ist, dass Sie keinen Proxy für versiegelte Klassen verwenden können. –

+0

Danke! Das sieht wirklich nach der Lösung aus, nach der ich gesucht habe (obwohl ich mehr darüber nachdenken muss). – Haggai

4

Verwenden Sie Decorator pattern oder schreiben Sie extension methods.

+1

Danke. Decorator Muster sind nicht geeignet, denke ich, da sie erfordern, dass ich mein ganzes Programm ändere, um sie zu verwenden, und ich möchte, dass der Wrapper für den Benutzer von T transparent ist. Betreffend Erweiterungsmethoden - können Sie eine ähnliche Methode verwenden, um ein hinzuzufügen Variable zur Klasse (dh zu jedem Objekt)? Oder nur Methoden? – Haggai

2

Vielleicht so etwas wie:

public class Wrapper<T> 
{ 
    public readonly T Object; 

    public Wrapper(T t) 
    { 
     Object = t; 
    } 
} 

Und man kann es dann wie folgt verwenden:

Wrapper<Square> mySquare = new Wrapper<Square>(new Square(2.5)); 
Console.Write("Edge {0} -> Area {1}", mySquare.Object.EdgeLength, mySquare.Object.Area); 
+0

Danke, aber das versuche ich zu vermeiden. Ich möchte den Wrapper für den Benutzer von T. transparent sein. – Haggai

+0

Diese Antwort hilft mir sehr: D – Krishan