C#Generic ToString如果是Array或IEnumerable则加入

时间:2013-11-13 10:59:23

标签: c# linq generics

我有一个Generic,它有一个字符串Method。如果泛型的类型是容器(Array,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 []”。

我怎样才能做到这一点?

3 个答案:

答案 0 :(得分:3)

问题在于string.JoinGenericProperty视为new[] {GenericProperty}而不是集合(请参阅params关键字)。

试试这段代码:

string.Join(",", ((IEnumerable)GenericProperty).Cast<object>());

答案 1 :(得分: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;
    }
}

答案 2 :(得分: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条件不是必需的,因为Array实现了IEnumerable