我试图识别对象中的可相关属性,然后将其转换为Dictionary对象
我用lambda表达式编写了一个linq查询,将列表列表转换为列表,我跟随此msdn article
的示例当我尝试在LINQPad中执行以下程序时,我收到编译时错误
void Main()
{
var list = new List<int>();
list.Add(1);
list.Add(2);
var list2 = new List<string>();
list2.Add("ab");
list2.Add("xy");
var obj = new { x = "hi", y = list, z = list2 , a =1};
var properties = (obj.GetType()).GetProperties()
.Select(x => new {name =x.Name , value= x.GetValue(obj, null)})
.Where( x=> x.value != null && (x.value is IEnumerable) && x.value.GetType() != typeof(string) )
.Select(x => new {name = x.name, value= x.value});
Console.WriteLine(properties);
foreach( var item in properties)
{
var col = (IEnumerable) item.value;
foreach ( var a in col)
{
Console.WriteLine("{0}-{1}",item.name,a);
}
}
//compile time error in following line
var abc = properties.SelectMany(prop => (IEnumerable )prop.value, (prop,propvalue) => new {prop,propvalue} )
.Select( propNameValue =>
new {
name = propNameValue.prop.name,
value = propNameValue.propvalue
}
);
Console.WriteLine(abc);
}
方法的类型参数 &#39; System.Linq.Enumerable.SelectMany(System.Collections.Generic.IEnumerable, System.Func&gt;中 System.Func)&#39;无法从中推断出来 用法。尝试明确指定类型参数。
如何重构SelectMany语句以消除错误,以便我可以获得类似于嵌套foreach循环的输出?
答案 0 :(得分:1)
我想简化您的问题,假设您有两个列表:listInt
和listString
var listInt = new List<int> { 1, 2 };
var listString = new List<string> { "ab", "xy" };
然后创建一个listObject
,如下所示:
var listObject = new object[] { listInt, listString };
如果你SelectMany
:
var output = listObject.SelectMany(list => list);
由于两个列表包含不同的类型,因此您将收到与您相同的错误。您可以考虑转换为IEnumerable<object>
,如:
var output = listObject.SelectMany(list => (IEnumerable<object>)list);
但它不适用于listInt
,因为co-variant不支持值类型。只是解决方案我会想:
var output = listObject.SelectMany(list => ((IEnumerable)list).Cast<object>());
因此,要映射您的问题,您可以更改:
prop => ((IEnumerable)prop.value).Cast<object>();