从对象创建连接的字符串

时间:2018-09-07 10:45:06

标签: c# reflection collections

我有一个视图,通过反射可以看到属性列表。这些既可以是单个项目,也可以是集合。我希望打印它们(单个值或连接的字符串)。

如何将集合转换为连接的字符串?我(除其他事项外)尝试了以下操作,但这不起作用:

@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的错误

有人知道我该怎么做吗?

1 个答案:

答案 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>

LINK

尝试一下:

// 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);