2011-01-24 20 views
3

拡張メソッドはsay:Listをパラメータの1つとして持つことができますか?拡張メソッドは汎用パラメータを持つことができますか?

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

拡張メソッドにはどのような制限がありますか?

+5

ほとんどの拡張メソッドには汎用パラメータがあります。 – Gabe

+1

I拡張メソッドの宣言からparamsを取り出すと、コードをコンパイルできます。あなたの拡張メソッドからparamsを取り出したくない場合は、List をXName [] –

+1

に変更する必要があります。本当に2つの質問をしています。最初のものは、リスト自体をparamすることはできません。定義する必要がありますListのparam配列を作成しないかぎり、 "params XName [] names"のような配列になります。 –

答えて

7

短い答えはです。拡張メソッドは、最初のパラメータthisキーワードのおかげで)のインスタンスメソッドのようにアクセスできるpublic staticメソッドです。つまり、静的メソッドで使用できるパラメータと同じパラメータを使用できます。

しかし、あなたはパラメータが実際に汎用的になりたい場合は、これにあなたの方法を変更する必要があるだろう:

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

あなたのメソッド定義内のすべての一般的な引数を指定する必要があります。

また、キーワードは配列以外のものには使用できません。つまり、params TName[]は問題ありませんが、params List<TName>は使用できません。

+1

''はメソッドシグネチャの一部である必要はありません。これらはメソッドの型パラメータではありません。それが 'IEnumerable 'と 'List 'だった場合、これは別の話になります。 –

+0

うんざりしています。どのように私はそれを逃したか分からない。 –

+0

完全には正しくありません:拡張メソッドで 'T [] params'を使うことができます**。答えの中で私が参考にしている質問のトップアンサー( 'In()')を見てください。 –

0

コンパイラがパラメータからジェネリック型を推測できるときと同じように、エクステンションメソッドには1つの制限があります。ヌルポインタを参照解除することができます(拡張メソッドbool IsNullorEmpty(this string)を書くことができますそれnull文字列の例については

は:LINQのは、素敵なジェネリック拡張メソッドに満ちている、とあなたはこの問題の(ジェネリック医薬品のスマート使用して)偉大な例をたくさん見ることができます:

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

関連する問題