C# 扩展一个不使用';不实现接口
我想重写ASP.NET JavaScriptSerializer类的序列化方法。没什么特别的,我只是想对从.NET返回的序列化字符串做一些额外的后处理 不幸的是,这个类上没有一个方法被声明为虚拟的,而且这个类本身也不是从接口或抽象类派生的(考虑到有多少核心.NET Framework类是为可扩展性而设计的,这似乎是一个奇怪的疏忽) 根据我对这个主题的一些阅读,我似乎有几个选择C# 扩展一个不使用';不实现接口,c#,extension-methods,decorator,C#,Extension Methods,Decorator,我想重写ASP.NET JavaScriptSerializer类的序列化方法。没什么特别的,我只是想对从.NET返回的序列化字符串做一些额外的后处理 不幸的是,这个类上没有一个方法被声明为虚拟的,而且这个类本身也不是从接口或抽象类派生的(考虑到有多少核心.NET Framework类是为可扩展性而设计的,这似乎是一个奇怪的疏忽) 根据我对这个主题的一些阅读,我似乎有几个选择 创建一个扩展方法。我不太喜欢这个选项,因为它涉及到创建一个类使用者需要知道的新方法(编译器不允许使用相同的名称/签名两
- 创建一个扩展方法。我不太喜欢这个选项,因为它涉及到创建一个类使用者需要知道的新方法(编译器不允许使用相同的名称/签名两次)
- 从具有完全相同签名的JavaScriptSerializer派生一个新类。因为JavaScriptSerializer没有虚拟方法,所以我会在每个方法/属性声明中使用“new”关键字来执行方法隐藏。我认为这个选项被认为是一个装饰图案
- 创建一个名为IJavaScriptSerializer的新接口,该接口将具有与JavaScriptSerializer相同的签名。删除代码中对JavaScriptSerializer的所有引用,并替换为对新创建接口的引用
List<MyObject> s = fillObject();
return s.ToJSON();
List s=fillObject();
返回s.ToJSON();
您误解了,它指的是继承类并封装该类的另一个实例的对象。(这在流中非常常见)。在你的情况下,这是不适用的
我建议您为JavaScriptSerializer
类制作自己的替代品(或包装器,以您需要的为准),而不必尝试使用相同的API。如果您需要能够交换实现,我将用核心方法创建一个接口或基类,并有两个具体的实现,一个封装原始实现,另一个添加后处理
一般来说,在设计类时,您应该根据自己的需要进行设计,而不是复制.Net Framework的内置类。现在您有了9000多个答案!:)准确地说是10555。谢谢你的贡献!