我有一个视图,通过反射可以看到属性列表。这些既可以是单个项目,也可以是集合。我希望打印它们(单个值或连接的字符串)。
如何将集合转换为连接的字符串?我(除其他事项外)尝试了以下操作,但这不起作用:
@foreach (var cell in Model.GetData().ToList())
{
<td>
@{ var value = cell.GetValue(row, null);}
@(cell.IsCollection() ?
String.Join(", ", (value as IEnumerable<object>).Select(o => o.ToString()).Select(o => o.ToString())) : value)
</td>
}
信息: *单元格的类型为PropertyInfo。 *值是一个对象或一个对象[]。对象数组中的一个或多个对象可以是字符串,布尔值或整数 * Iscollection是一种自行编写(并经过测试)的扩展方法,当PropertyInfo单元格包含一个Collection作为值时,它将返回true
更新: 以下内容也不起作用:
if (cell.IsCollection())
{
values = String.Join(", ", (IEnumerable<object>)value);
}
这将产生以下错误:
无法转换类型System.Collections.Generic.List 1[System.Int32] to type System.Collections.Generic.IEnumerable
1 [System.Object]。'
请注意:
IEnumerable<object>)value
这有效。
String.Join(", ", (IEnumerable<object>)value)
引发类型为System.EntryPointNotFoundException的错误
有人知道我该怎么做吗?
答案 0 :(得分:2)
只需:
var joinedString = String.Join(", ", value as IEnumerable<object>);
这:
.Select(o => o.ToString()).Select(o => o.ToString())
是错误的。因为:
// cast to `IEnumerable` of type `object`
(value as IEnumerable<object>)
// convert to IEnumerable<string>
.Select(o => o.ToString())
// join everything to one string
String.Join(", ", ...)
// and then you again call select on `string`
// which operates on IEnumerable<char>
.Select(o => o.ToString()))
因此,如您所见,您需要删除这两个Select
调用。
更新:
哦,我明白了。由于语言限制,您无法将IEnumerable<struct>
强制转换为IEnumerable<object>
。
尝试一下:
// you need to cast to non-generic `IEnumerable`
// then use `Cast` extension method to convert to generic enumerable
IEnumerable<object> valueAsEnumerable = ((IEnumerable)value).Cast<object>();
// then use it in `string.join`
var joinedString = String.Join(", ", valueAsEnumerable);