我有一个结构定义
public class FullIndexList
{
public IList<IndexCurrency> IndexCurrency { get; set; }
public IList<Indices> Indices { get; set; }
}
The List returned from the method
所以基本上列表项是属性FullIndexList,类型是List`1
我想将结果转换为FullIndexList。
我已尝试使用强制转换为结果.Cast()它将错误视为无效强制转换,我也尝试过使用results.ConvertAll 但在这种情况下,我需要像这样的硬编码
fullIndexList.IndexCurrency = results[0] as IList<IndexCurrency>;
fullIndexList.Indices = results[1] as IList<Indices>;
看起来不对。
我可以考虑使用Reflection或Automapper,但我相信可能有更好的方法。
答案 0 :(得分:0)
这会使您的结果变平,然后找到要生成IList
的类型。
var flat = results.OfType<IEnumerable<object>>().SelectMany((x) => x).ToArray();
fullIndexList.IndexCurrency = flat.OfType<IndexCurrency>().ToList();
fullIndexList.Indices = flat.OfType<Indices>().ToList();
您的results
是List<dynamic>
因此需要将其强制转换为IEnumerable<object>
或任何其他公共基类或接口。这意味着如果您的IndexCurrency
或Indices
是结构,则很难。 Struct不能直接转换为object
。 Why cannot IEnumerable<struct> be cast as IEnumerable<object>?
如果您可以results
不使用dynamic
,则会变得非常简单,因为您可以通过SelectMany()
直接使其变平。
答案 1 :(得分:0)
我能够使用zip和tupple来完成它。
foreach (var tuple in typeof(FullIndexList).GetProperties().Zip(results, Tuple.Create))
{
tuple.Item1.SetValue(full, tuple.Item2, null);
}
其中FullIndexList是容器类型。
但是我没有进行任何检查,并且假设两个列表中的订单和项目没有完全相同。