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 回答
3

问题在于它不被string.Join视为集合(参见params关键字)。GenericPropertynew[] {GenericProperty}

试试这个代码:

string.Join(",", ((IEnumerable)GenericProperty).Cast<object>());
于 2013-11-13T11:03:44.620 回答
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条件不是必需的,因为Arrayimplements IEnumerable

于 2013-11-13T11:06:32.357 回答