扩展方法可以有通用参数吗?

时间:2011-01-24 21:47:03

标签: c# linq generics linq-to-xml extension-methods

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

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

扩展方法可以对参数类型有任何限制吗?

2 个答案:

答案 0 :(得分:7)

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

但如果您希望参数实际上是通用的,则需要将方法更改为:

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

您必须在方法定义中指定所有通用参数。

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

答案 1 :(得分:0)

类型感染有限制(例如编译器可以从参数中猜出泛型类型。扩展方法有一个限制:你可以“取消引用”空指针(你可以编写和扩展方法{{1}并在空字符串上使用它。

例如:Linq充满了很好的通用扩展方法,你可以在这个问题中看到很多很好的例子(巧妙地使用泛型):

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