对象的 C# 包装器

Posted

技术标签:

【中文标题】对象的 C# 包装器【英文标题】:C# wrapper for objects 【发布时间】:2011-02-25 01:13:42 【问题描述】:

我正在寻找一种方法来为任何对象创建通用包装器。 包装器对象的行为就像它包装的类一样,但能够拥有更多的属性、变量、方法等,例如对象计数、缓存等

假设包装类叫Wrapper,要包装的类叫Square,并且有构造函数Square(double edge_len)以及属性/方法EdgeLengthArea,我想如下使用:

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

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

建议?

谢谢。

【问题讨论】:

你不能在 C# 3.0 之前做到这一点。然而,4.0 版可能允许您通过新的动态类型系统来执行此操作。 您能详细说明一下吗?谢谢。 【参考方案1】:

使用Decorator pattern 或写extension methods。

【讨论】:

谢谢。我认为装饰器模式不合适,因为它们需要我更改整个程序才能使用它们,而且我希望包装器对 T 的用户是透明的。关于扩展方法 - 你可以使用类似的方法来添加类的变量(即每个对象)?还是只有方法?【参考方案2】:

Castle 项目中的DynamicProxy 可能是您的解决方案。

【讨论】:

+1,是的 - 问题显然是在寻找代理实现。 DynamicProxy 在 .NET 开源世界中被广泛使用(NMock2、NHibernate、Ninject 等都使用它)。唯一重要的警告是您将无法为密封类使用代理。 谢谢!这看起来确实像我正在寻找的解决方案(尽管我必须深入研究它)。【参考方案3】:

可能是这样的:

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

【讨论】:

谢谢,但这就是我要避免的。我希望包装器对 T 的用户是透明的。 这个答案对我有很大帮助:D

以上是关于对象的 C# 包装器的主要内容,如果未能解决你的问题,请参考以下文章

COM 互操作:C# COM 类包装器引发异常

C# Ghostscript 包装器

Unity GET/POST 包装器

casmcard 包装器

acdbEntGet 和 acdbEntGetX 的 C# 包装器

用于 C# 的 Lua 包装器? [关闭]