2011-01-24 86 views
3

扩展方法有一个说法:List作为参数之一吗?扩展方法可以有通用参数吗?

public static IEnumerable<XElement> GetSequenceDescendants(this IEnumerable<XElement> elements, params List<XName> names) 
     { 
      //do something 
     } 

扩展方法可以有什么参数类型的限制吗?

+5

大多数扩展方法都有通用参数。 – Gabe 2011-01-24 21:49:41

+1

I如果你从你的扩展方法声明中取出参数,你的代码就可以编译。如果你不想从你的扩展方法中取出参数,你需要将列表更改为XName [] – 2011-01-24 21:55:27

回答

7

简短的回答是一个扩展方法是只是其中可以像第一参数(感谢this关键字)的一个实例方法进行访问的公共静态方法。这意味着您可以使用任何静态方法中可以使用的相同参数。

但是如果你想要的参数实际上是通用的你需要改变你的方法是:

public static IEnumerable<TElement> GetSequenceDescendants<TElement, TName>(this IEnumerable<TElement> elements, List<TName> names) 
{ 
    //do something 
} 

您的方法定义指定所有的通用参数。

此外,您不能将params关键字与除数组之外的任何内容一起使用,即params TName[]没问题,但params List<TName>不是。

0

对类型排除有限制(如在编译器可以从参数中猜测通用类型的时候)。扩展方法有一个限制:可以“取消引用”空指针(可以编写和扩展方法bool IsNullorEmpty(this string)并使用它放在一个空字符串

有关示例:LINQ的是满好看的通用扩展方法,你可以看到很多很好的例子(智能使用泛型的)这样一个问题:

What are your favorite extension methods for C#? (codeplex.com/extensionoverflow)

相关问题