我有一个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 []”。
我怎样才能做到这一点?
答案 0 :(得分:3)
问题在于string.Join
将GenericProperty
视为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
。