扩展一个没有实现接口的类

时间:2009-10-20 02:10:01

标签: c# extension-methods decorator

我想重写ASP.NET JavaScriptSerializer类的Serialize方法。没什么太花哨的,我只想对从.NET返回的序列化字符串做一些额外的后处理。

不幸的是,这个类中没有一个方法被声明为虚拟,并且类本身不是从接口或抽象类派生的(考虑到有多少核心.NET Framework类是为可扩展性而设计的,这似乎是一种奇怪的疏忽)。

根据我对这个主题所做的一些阅读,看来我有几个选择可供选择。

  • 创建扩展方法。我不是这个选项的忠实粉丝,因为它涉及创建一个新的方法(编译器不允许使用相同的名称/签名两次),类消费者需要知道。

  • 从JavaScriptSerializer派生一个具有完全相同签名的新类。由于JavaScriptSerializer没有虚方法,我会在每个方法/属性声明中使用“new”关键字来执行方法隐藏。我认为这个选项被认为是一个装饰模式?

  • 创建一个名为IJavaScriptSerializer的新接口,该接口与JavaScriptSerializer具有相同的签名。删除我的代码中的所有引用到JavaScriptSerializer并替换为对新创建的接口的引用。

我很想知道其他方法以及每种方法的优点/缺点。

感谢您花时间阅读。

2 个答案:

答案 0 :(得分:3)

你误解了Decorator Pattern,它指的是一个继承一个类并包装该类的另一个实例的对象。 (这对于流非常常见)。在你的情况下,它不适用。

我建议你为JavaScriptSerializer类自己替换(或者你需要的包装器),而不是尝试使用相同的API。如果你需要能够交换实现,我会用核心方法创建一个接口或基类,并有两个具体的实现,一个包装原始,一个添加后处理。

通常,在设计类时,您应该设计满足您的需求,而不是复制.Net Framework的内置类。

答案 1 :(得分:0)

转到http://json.org并删除具有源代码的几个类之一,用于JSON序列化。

然后,进行后期处理,编译并在项目中使用。

理想情况下,此时我会创建一个扩展方法,所以我可以这样做:

List<MyObject> s = fillObject();
return s.ToJSON();