Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/272.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 扩展一个不使用';不实现接口_C#_Extension Methods_Decorator - Fatal编程技术网

C# 扩展一个不使用';不实现接口

C# 扩展一个不使用';不实现接口,c#,extension-methods,decorator,C#,Extension Methods,Decorator,我想重写ASP.NET JavaScriptSerializer类的序列化方法。没什么特别的,我只是想对从.NET返回的序列化字符串做一些额外的后处理 不幸的是,这个类上没有一个方法被声明为虚拟的,而且这个类本身也不是从接口或抽象类派生的(考虑到有多少核心.NET Framework类是为可扩展性而设计的,这似乎是一个奇怪的疏忽) 根据我对这个主题的一些阅读,我似乎有几个选择 创建一个扩展方法。我不太喜欢这个选项,因为它涉及到创建一个类使用者需要知道的新方法(编译器不允许使用相同的名称/签名两

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

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

根据我对这个主题的一些阅读,我似乎有几个选择

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

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

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

我很想听听其他方法以及每种方法的优缺点

感谢您花时间阅读。

转到并d/l有源代码的几个类之一,用于JSON序列化

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

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

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

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

我建议您为
JavaScriptSerializer
类制作自己的替代品(或包装器,以您需要的为准),而不必尝试使用相同的API。如果您需要能够交换实现,我将用核心方法创建一个接口或基类,并有两个具体的实现,一个封装原始实现,另一个添加后处理


一般来说,在设计类时,您应该根据自己的需要进行设计,而不是复制.Net Framework的内置类。

现在您有了9000多个答案!:)准确地说是10555。谢谢你的贡献!