2010-05-28 4 views
5

Je suis à la recherche d'un moyen de créer un wrapper générique pour n'importe quel objet.
L'objet wrapper se comporte exactement comme la classe qu'il enveloppe, mais il peut avoir plus de propriétés, de variables, de méthodes, etc., par exemple. le comptage d'objets, la mise en cache, etc.Enveloppe C# pour les objets

Dites la classe wrapper appelé Wrapper, et la classe à envelopper appelée place et a le constructeur place (à double edge_len) et les propriétés/méthodes EdgeLength et Area, je voudrais l'utiliser comme suit:

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

il est évident que je peux créer une telle classe wrapper pour chaque classe que je veux envelopper, mais je suis à la recherche d'une solution générale, i. e) Wrapper<T> qui peut gérer à la fois les types primitifs et composés (bien que dans ma situation actuelle, je serais content de simplement emballer mes propres classes).

Suggestions?

Merci.

+0

Vous ne pouvez pas faire cela avec C# jusqu'à 3.0. La version 4.0, cependant, pourrait vous permettre de le faire via le nouveau système de type dynamique. –

+0

Pourriez-vous élaborer? Merci. – Haggai

Répondre

2

DynamicProxy du projet Château pourrait être la solution pour vous.

+1

+1, oui - la question est clairement à la recherche d'une implémentation de proxy. DynamicProxy est largement utilisé dans le monde open source .NET (NMock2, NHibernate, Ninject, etc. tous l'utilisent). La seule mise en garde importante est que vous ne serez pas en mesure d'utiliser un proxy pour les classes scellées. –

+0

Merci! Cela ressemble vraiment à la solution que je cherchais (bien que je devrais creuser plus dedans). – Haggai

4

Utilisez Decorator pattern ou écrivez extension methods.

+1

Merci. Les modèles de décorateurs ne sont pas adaptés, je pense, car ils nécessitent que je change tout mon programme pour les utiliser, et je voudrais que l'emballage soit transparent pour l'utilisateur de T. Concernant les méthodes d'extension - pouvez-vous utiliser une méthode similaire pour ajouter variable à la classe (c'est-à-dire à chaque objet)? Ou seulement des méthodes? – Haggai

2

Peut-être quelque chose comme ceci:

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

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

Et vous pouvez alors l'utiliser comme suit:

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

Merci, mais c'est ce que j'essaie d'éviter. Je voudrais que l'emballage soit transparent pour l'utilisateur de T. – Haggai

+0

Cette réponse m'aide beaucoup: D – Krishan