将List`1映射到Object属性

时间:2016-10-21 06:44:04

标签: c# .net linq mapping

我有一个结构定义

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,但我相信可能有更好的方法。

2 个答案:

答案 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();

您的resultsList<dynamic>因此需要将其强制转换为IEnumerable<object>或任何其他公共基类或接口。这意味着如果您的IndexCurrencyIndices是结构,则很难。 Struct不能直接转换为objectWhy 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是容器类型。

但是我没有进行任何检查,并且假设两个列表中的订单和项目没有完全相同。