C#向类的实例添加扩展方法

本文关键字:添加 扩展 方法 实例 | 更新日期: 2023-09-27 18:22:25

我基本上想为ArrayList的每个副本注入一个扩展方法,它将执行以下行为:

ArrayList ourList = new ArrayList();
ourList.Add(randomarray or random arraylist);

它会将给定数组、arraylist或堆栈的CONTENT添加到"ourList",而不是数组、arrayist或堆栈本身。

然而,我的问题是:

如何将扩展方法ONLY注入到实例化类中?以下代码将该方法添加到ArrayList基类和任何实例化副本中,但我希望它仅在访问该类的实例化副本时可用。

    public static void Add(this ArrayList ourlist){
    }
    ArrayList.Add(); // Works, but shouldn't
    ArrayList result = new ArrayList();
    result.Add(); // Works

那么,我该如何处理呢?

C#向类的实例添加扩展方法

如何将扩展方法ONLY注入到实例化类中?

如果您正在讨论向单个实例添加扩展方法,则不能。C#中没有这样的概念。扩展方法"扩展"类型,而不是该类型的单个实例。如果编译器只有在执行时才知道哪些实例在编译时应用了扩展,您怎么会期望它知道呢?

如果你谈论的是像任何其他静态方法一样调用扩展方法,那么总是是可行的,并且是无法阻止的。所以你可以随时拨打:

MyExtensionClass.Add(null, null);

如果您不是在谈论这两件事中的任何一件,那么您的意思还不清楚,但如示例代码中所示,对ArrayList.Add进行静态调用确实不会编译。您确定没有名为ArrayList变量吗?(那肯定会把事情搞砸。)

此外,由于ArrayList已经有了Add(object)实例方法,所以无论如何都不会使用新的扩展方法。(你真的应该尽快离开非泛型集合。)