C#将扩展方法添加到类的实例中?

时间:2013-07-15 13:03:07

标签: c# extension-methods member instances

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

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

它将给定数组,arraylist或stack的CONTENT添加到'ourList'而不是数组,arraylist或stack本身。

但是,我的问题是:

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

    public static void Add(this ArrayList ourlist){

    }

    ArrayList.Add(); // Works, but shouldn't
    ArrayList result = new ArrayList();
    result.Add(); // Works

那么,我该如何管理呢?

1 个答案:

答案 0 :(得分:10)

  

如何仅将扩展方法注入实例类?

如果您正在谈论为个别实例添加扩展方法,则不能。 C#中没有这样的概念。扩展方法“扩展”类型,而不是类型的单个实例。如果知识只在执行时可用,那么您希望编译器知道哪些实例在编译时应用了扩展名?

如果您正在讨论像任何其他静态方法一样调用扩展方法,总是是可行的,并且无法阻止。所以你总是可以打电话:

MyExtensionClass.Add(null, null);

如果你没有谈论这两件事,那就不清楚你的意思了 - 但是如你的示例代码所示,对ArrayList.Add进行静态调用真的不会编译。您确定没有名为ArrayList变量吗? (那肯定会搞砸了。)

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