web-dev-qa-db-ja.com

ToStringの拡張メソッドを作成する方法

私はこれを試しました:

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>の両方では機能しません。多分私はいくつかの特別な注釈が必要ですか?

50
IAdapter

拡張メソッドは、一致する該当する候補メソッドがないがある場合にのみチェックされます。 ToString()の呼び出しの場合、常にが適用可能な候補メソッド、つまりobjectToString()になります。拡張メソッドの目的はextend型で使用可能なメソッドのセットであり、override既存のメソッドではありません。それが「拡張メソッド」と呼ばれる理由です。既存のメソッドをオーバーライドする場合は、オーバーライドするメソッドを作成する必要があります。

108
Eric Lippert

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());
    }
}
_
5
matt.dolfin

単にあなたは使用しないでください名前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メソッドを呼び出すときに、stringintのようなタイプに言及する必要があります。

4
Shekhar_Pro