2011-01-24 63 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)

相關問題