2013-07-15 65 views
-1

我基本上要注入的扩展方法的ArrayList的每个副本,这会执行以下行为:C#将扩展方法添加到类的实例?

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

它会增加给定的阵列中,数组列表的内容或堆到“ourList”,而不是数组,数组,列表或堆栈本身。

不过,我的问题是:

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

public static void Add(this ArrayList ourlist){ 

    } 

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

那么,我该如何管理呢?

+0

什么是*实例副本*应该是什么? –

+0

总之,你不能。类型的所有方法和类型的所有扩展方法都适用于该类型的所有实例。 –

+0

我想你的意思是实例化? (!= NULL)? –

回答

10

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

如果您正在讨论将扩展方法添加到单个实例,则不能。 C#中没有这样的概念。扩展方法“扩展”了类型,而不是类型的单个实例。如果知识仅在执行时才可用,您如何期望编译器知道哪些实例在编译时应用了扩展?

如果您正在讨论像其他静态方法一样调用扩展方法,那么总是是可行的,并且不能被阻止。所以,你可以随时拨打:

MyExtensionClass.Add(null, null); 

如果你不谈论任何的那些东西,目前还不清楚你的意思 - 但制作静态调用ArrayList.Add如图真的赢了”你的示例代码编译。你确定你没有变量ArrayList? (这肯定会搞砸了。)

此外,由于ArrayList已经有一个Add(object)实例方法,您的新扩展方法永远不会被使用。 (您应该尽可能快地远离非通用集合。)

+1

'ArrayList.Add()'可以工作,如果静态扩展类命名为ArrayList,但有两个参数'ArrayList.Add(list,value)' –

+1

@SriramSakthivel:在这一点'ArrayList result = new ArrayList();'wouldn没有工作。类型名称'ArrayList'只能表示特定上下文中的一种类型。 –

+0

是的,你是对的。如果它是ArrayList.Add(list,value);和System.Collections.ArrayList结果=新的System.Collections.ArrayList()假定没有使用导入System.Collections导入 –