2

私は2つの拡張方法を持っています:

    public static string ToString(this List<object> list, char delimiter)
    {
        return ToString<object>(list, delimiter.ToString());
    }

    public static string ToString(this List<object> list, string delimiter)
    {
        return ToString<object>(list, delimiter);
    }

これを使用する場合:

    char delimiter = ' ';
    return tokens.ToString(delimiter);

うまくいきません。char オーバーロードは、コード補完リストにも表示されません。誰かがこれを機能させる方法を教えてもらえますか?

編集

私はうっかり言い忘れていましたが、実際には 3 つの拡張メソッドがあり、3 つ目は次のとおりです。

    public static string ToString<T>(this List<T> list, string delimiter)
    {
        if (list.Count > 0)
        {
            string s = list[0].ToString();

            for (int i = 1; i < list.Count; i++)
                s += delimiter + list[i].ToString();

            return s;
        }

        return "";
    }
4

2 に答える 2

10

拡張メソッドがあるクラスへの参照を追加します。

using MyApplicationNamespace.ToStringExtensionClass;

VS / ReSharper は、その特定の署名ではなく、メソッドが既に認識されているという理由だけで、参照を自動的に追加することを提案しません。

また、ジェネリック パラメータを持つ 3 番目の拡張メソッドがない限り、メソッド自体はコンパイルされません。

彼らが私のために働く方法(コンパイルして論理的に):

public static string ToString(this List<object> list, char delimiter)
{
    return ToString(list, delimiter.ToString());
}

public static string ToString(this List<object> list, string delimiter)
{
    return string.Join(delimiter, list);
}

使用法は次のようになります。

var list = new List<int> { 1, 2, 3, 4, 5 };
var str = list.Cast<object>().ToList().ToString(' ');

キャストを避けてメソッドをジェネリックにしたい場合は、次のように変更します。

public static string ToString<T>(this List<T> list, char delimiter)
{
    return ToString(list, delimiter.ToString());
}

public static string ToString<T>(this List<T> list, string delimiter)
{
    return string.Join(delimiter, list);
}

そして、使用法ははるかにきれいです:

var list = new List<int> { 1, 2, 3, 4, 5 };
var str = list.ToString(' ');

編集

したがって、編集後、問題をよりよく理解できます。非ジェネリック メソッドを失い、ジェネリック オーバーロードを使用して char も受け入れる必要があります。

public static string ToString<T>(this List<T> list, char delimiter)
{
    return ToString(list, delimiter.ToString());
}

public static string ToString<T>(this List<T> list, string delimiter)
{
    ...
}

また、実装しようとしているロジックは、次の方法で簡単に実現できます。

string.Join(delimiter, list);

したがって、リストの拡張メソッドとして本当に必要でない限り、基本的にこれらのメソッドをすべて削除して、それを使用することができます。

于 2012-05-13T04:42:42.470 に答える
1

あなたの問題は、ジェネリック List のオブジェクトのタイプを指定していて、それをジェネリック メソッドにしていないことだと思います。

次のようなものを定義したときに機能するかどうかを確認します。

public static string ToString<T>(this List<T> list, char delimiter) 
{ 
    return ToString<T>(list, delimiter.ToString()); 
} 

public static string ToString<T>(this List<T> list, string delimiter) 
{ 
    return String.join(list, delimiter); 
} 

ToString<T>(this List<T> list, string delimiter)文字列区切り文字を使用した元の関数は自分自身を呼び出すだけだったので、ここで String.join のような便利なことを行うには、変更する必要があります

于 2012-05-13T04:47:43.083 に答える