2010-05-28 16 views
5

Estoy buscando una forma de crear un contenedor genérico para cualquier objeto.
El objeto contenedor se comportará igual que la clase que envuelve, pero podrá tener más propiedades, variables, métodos, etc., como p. Ej. conteo de objetos, el almacenamiento en caché etc.Contenedor C# para objetos

Di la clase contenedora ser llamado Wrapper, y la clase para ser envuelto ser llamado Square y tiene el constructor Square (doble edge_len) y de las propiedades/métodos EdgeLength y Área, me gustaría utilizarlo como sigue:

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

Obviamente, puede crear una clase tal envoltorio para cada clase quiero envolver, pero estoy en busca de una solución general, i. e. Wrapper<T> que puede manejar tanto los tipos primitivos como los compuestos (aunque en mi situación actual, me gustaría incluir mis propias clases).

Sugerencias?

Gracias.

+0

No puede hacer esto con C# hasta 3.0. La versión 4.0, sin embargo, podría permitirle hacer esto a través del nuevo sistema de tipo dinámico. –

+0

¿Podrías por favor dar más detalles? Gracias. – Haggai

Respuesta

2

DynamicProxy del proyecto Castillo podría ser la solución para usted.

+1

+1, sí, la pregunta está buscando claramente una implementación de proxy. DynamicProxy es ampliamente utilizado en el mundo de fuente abierta de .NET (NMock2, NHibernate, Ninject, etc. todos lo usan). La única advertencia importante es que no podrá usar un proxy para las clases selladas. –

+0

¡Gracias! Esta realmente se parece a la solución que estaba buscando (aunque tendré que profundizar más en ella). – Haggai

4
+1

Gracias. Los patrones decorativos no son adecuados, creo, ya que requieren que cambie todo el programa para usarlos, y me gustaría que el envoltorio sea transparente para el usuario de T. En cuanto a los métodos de extensión, ¿puede usar un método similar para agregar un variable a la clase (es decir, a cada objeto)? ¿O solo métodos? – Haggai

2

Tal vez algo como esto:

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

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

Y entonces se podría utilizar de la siguiente manera:

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

Gracias, pero eso es lo que trato de evitar. Me gustaría que el envoltorio sea transparente para el usuario de T. – Haggai

+0

Esta respuesta me ayuda mucho: D – Krishan

Cuestiones relacionadas