1

文字列メソッドを持つジェネリックがあります。ジェネリックのタイプがコンテナー (配列、IEnumerable など) の場合、それらの値はコンマで区切る必要があります。

public class Test<T>
{
    public T GenericProperty { get; set; }

    public override string ToString()
    {
        string ret;
        if (GenericProperty is Array || GenericProperty is IEnumerable)
        {
            ret = String.Join(",", GenericProperty);
        }
        else
        {
            ret = GenericProperty.ToString();
        }
        return ret;
    }
}

linq 式 ( ) を追加してテストしたいのですSelect(x => x.ToString()が、linq が利用できません。

上記のコードをデバッグすると、if 句が正しく実行されます。しかし、結果として「System.Int32[]」しか得られません。

どうすればこれを達成できますか?

4

3 に答える 3

3

実際にString.Joinは、文字列をparams object[]引数として受け取るオーバーロードを使用しています。

GenericProperty を にキャストする必要がありますIEnumerable<T>

public class Test<T>
{
    public T GenericProperty { get; set; }

    public override string ToString()
    {
        string ret;
        if ( GenericProperty is IEnumerable)
        {
            IEnumerable en = GenericProperty as IEnumerable;
            ret = String.Join(",", en.Cast<object>());

        }
        else
        {
            ret = GenericProperty.ToString();
        }
        return ret;
    }
}
于 2013-11-13T11:07:34.033 に答える
2

T制約がないため、次の行:

String.Join(",", GenericProperty);

このオーバーロードを呼び出します:

public static string Join(string separator, params object[] values);

への呼び出しを引き起こしますGenericProperty.ToString()Join次の方法で達成できる別のオーバーロードを呼び出す必要があります。

        if (GenericProperty is IEnumerable)
        {
            ret = string.Join(",", ((IEnumerable)GenericProperty).Cast<object>());
        }

ちなみに、実装するis Arrayので、条件は必要ありません。ArrayIEnumerable

于 2013-11-13T11:06:32.357 に答える