如何通过C#中的扩展来扩展带有接口的类和结构



我正在为C#中的各种.Net Framework数据结构制作一个实用程序库。我正在尝试将ICloneable添加到Dictionary<>。有没有一种方法可以通过扩展来做到这一点,比如如何制作扩展方法?

为了进一步澄清,在C#中,您可以通过在静态类中制作"扩展方法"来扩展现有的类,如下所示:

public static class MyExtensions
{
public static void MyArrayExtension<T>(this T[] arg)
{
//Your code here...
}
}

这允许您在所有阵列上执行该功能,如下所示:

MyArray.MyArrayExtension();

您可以创建扩展方法来扩展所有类和结构,包括您在DLL中引用的那些类和结构(如.Net Framework中引用的类和结构(。我目前正在使用它来帮助我设计一个实用程序库,其中有大量有用的扩展,我觉得这些扩展应该首先在C#中实现。

当查看System.Linq时,接口似乎以某种方式添加到某些数据结构类中,如ArrayList<>,但仅当包含名称空间时。我正试图弄清楚这是如何做到的,因为我在网上搜索后找不到任何例子。

到目前为止,这是不可能的。

您可以添加必要的Clone扩展方法,但现在还没有办法对整个接口进行填充。

请记住,检查对接口的支持可以用现有代码编写,如下所示:

if (dictionary is ICloneable cloneable)
var clone = cloneable.Clone();

但这不能仅用于扩展,因为底层类型实际上并没有实现接口


在这一思路上有一些正在进行的努力:

  • 扩展一切
  • 形状

我不知道他们能把这些东西弄得有多好,所以未来是否有可能解决这个问题还有点悬而未决。


请注意,您可以使用装饰来完成此操作,但这可能需要一些工作,并且需要使用不同的类型来构建字典:

public class CloneableDictionary<TKey, TValue> : Dictionary<TKey, TValue>, ICloneable
{
... methods and properties that delegate to base.XYZ
public object Clone() => new ...
}

无论你在哪里构建你的对象,你都必须这样写:

var dictionary = new CloneableDictionary<...>();

而不是:

var dictionary = new Dictionary<...>();

由于CloneableDictionary继承了Dictionary,您可以将其放入已经存在的变量和参数中,即使它们的类型保持为Dictionary<...>,但如果您忘记了您实际上在其中存储了其他字典类型,并构建了新的、正常的、不可克隆的字典,有些地方可能会很快崩溃。

最新更新