私はこれを試しました:
public static class ListHelper
{
public static string ToString<T>(this IList<String> list)
{
return string.Join(", ", list.ToArray());
}
public static string ToString<T>(this String[] array)
{
return string.Join(", ", array);
}
}
ただし、string[]
とList<string>
の両方では機能しません。多分私はいくつかの特別な注釈が必要ですか?
拡張メソッドは、一致する該当する候補メソッドがないがある場合にのみチェックされます。 ToString()
の呼び出しの場合、常にが適用可能な候補メソッド、つまりobject
のToString()
になります。拡張メソッドの目的はextend型で使用可能なメソッドのセットであり、override既存のメソッドではありません。それが「拡張メソッド」と呼ばれる理由です。既存のメソッドをオーバーライドする場合は、オーバーライドするメソッドを作成する必要があります。
files.ToString()
が返すものを置き換えたいようです。 files
を割り当てるカスタムクラスを記述せずにそれを行うことはできません(つまり、リストから継承し、ToString()
をオーバーライドします)。
まず、ジェネリック型(_<T>
_)を削除します。使用していません。次に、files.ToString()
を呼び出すとListのToStringメソッドが呼び出されるだけなので、拡張メソッドの名前を変更する必要があります。
これはあなたが探していることを行います。
_static class Program
{
static void Main()
{
var list = new List<string> { {"a"}, {"b"}, {"c"} };
string str = list.ToStringExtended();
}
}
public static class ListHelper
{
public static string ToStringExtended(this IList<String> list)
{
return string.Join(", ", list.ToArray());
}
}
_
単にあなたは使用しないでください名前ToString
拡張メソッドのメソッドはすでに存在しているため呼び出されないため、T
は使用しないでくださいそこには役に立たない。
たとえば、私はこれを試して、もう一度同じことを返しました:
Console.WriteLine(lst.ToString<int>());
出力:
shekhar, shekhar, shekhar, shekhar
したがって、今回はint
を使用しましたが、Tはメソッドプロトタイプを変更する以外に使用できないため、引き続き実行されました。
それで、単にToString
Literalをメソッド名として使用しているのはなぜですか?それは既に存在し、Extensionメソッドではオーバーライドできませんです。これが、T
を使用して汎用にする必要がある理由です。次のような別の名前を使用します
public static string ToMyString(this IList<String> list)
そうすれば、ジェネリックを使用する必要がないので、いつものように呼び出すことができます。
それはあなたのコードが私のために働いていると述べました。これが私が試したものです(LINQPADで):
void Main()
{
List<string> lst = new List<string>();
lst.Add("shekhar");
lst.Add("shekhar");
lst.Add("shekhar");
lst.Add("shekhar");
lst.ToString<string>().Dump();
}
public static class ListHelper
{
public static string ToString<T>(this IList<String> list)
{
return string.Join(", ", list.ToArray());
}
public static string ToString<T>(this String[] array)
{
return string.Join(", ", array);
}
}
そして出力はshekhar, shekhar, shekhar, shekhar
でした
ToString<T>
でT
を指定したので、ToStringメソッドを呼び出すときに、string
やint
のようなタイプに言及する必要があります。