2010-05-28 88 views
5

我正在寻找一种方法来为任何对象创建通用包装。
包装对象的行为就像它所包装的类一样,但是可以有更多的属性,变量,方法等。对象计数,缓存等对象的C#包装

说包装类被称为包装,并且被包裹被称为广场类,并且具有构造广场(双edge_len)和属性/方法,其边缘,我想如下使用它:

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

很显然,我可以创建这样一个包装类为每个类我想换,但我正在寻找一个通用的解决方案,我。 e。Wrapper<T>它可以处理原始类型和复合类型(尽管在我目前的情况下,我只会包装自己的类而感到高兴)。

对此提出建议?

谢谢。

+0

你不能用C#做到这一点,最高3.0。但是,4.0版可能会让您通过新的动态类型系统执行此操作。 – 2010-05-28 09:27:41

+0

请您详细说明一下吗?谢谢。 – Haggai 2010-05-28 11:52:00

回答

2

DynamicProxy从城堡项目可能是你的解决方案。

+1

+1,是的 - 问题显然是寻找代理实现。 DynamicProxy被广泛用于.NET开源世界(NMock2,NHibernate,Ninject等等都使用它)。唯一重要的警告是你将无法使用密封类代理。 – 2010-05-28 13:22:01

+0

谢谢!这看起来像我正在寻找的解决方案(尽管我将不得不深入挖掘它)。 – Haggai 2010-05-28 13:49:58

4
+1

谢谢。我认为装饰者模式并不适合,因为他们要求我改变我的整个程序来使用它们,我希望包装对T的用户是透明的。关于扩展方法 - 你可以使用类似的方法来添加变量的类(即每个对象)?还是只有方法? – Haggai 2010-05-28 11:58:46

2

也许是这样的:

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

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

然后你可以按如下方式使用它:

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

谢谢,但这正是我想要避免的。我希望包装对T的用户透明。 – Haggai 2010-05-28 11:48:33

+0

此答案帮助我很多:D – Krishan 2017-01-10 15:05:51