【问题标题】:Convert anonymous type to List<object>将匿名类型转换为 List<object>
【发布时间】:2019-02-11 09:24:16
【问题描述】:

我有一组从包含许多字段(最多 50 个)的数据库中转储的匿名对象。

例子:

var anonymousData = new
        {
            Z = "2",
            B = "4",
            C = "3",
            D = 5
        }; 

我想用这些数据得到以下输出

List<object> allObjects ... with { "2", "4", "3", 5 };

什么是反映它的正确方法?

编辑:我想保留最初的订单

【问题讨论】:

  • 您希望这些字段按什么顺序排列?按字母顺序?不在乎?
  • 我想要它的样子。
  • 不行。从反射返回属性的顺序是不确定的。
  • @Rango : 因为有些字段是整数和 guid。
  • 到目前为止你有没有尝试过?我们不会在这里为您提供完整的解决方案,您必须自己考虑。

标签: c# reflection anonymous-types


【解决方案1】:

通过反射可以获得所有值:

var anonymousData = new
        {
            Z = "2",
            B = "4",
            C = "3",
            D = 5
        };

Type t = anonymousData.GetType();
Property[] p = t.GetProperties();
List<object> xy = p.Select(x => x.GetValue(anonymousData)).ToList();

您补充说,您希望在结果列表中保持属性的顺序。这是不可能的——想想 Car 类型的对象:

new MyCar { Id = 3, Color= "red"};

这和汽车没有什么不同

new MyCar { Color= "red", Id = 3};

属性切换时。恕我直言,匿名类型没有什么不同。因此,在将其导出为 CSV 时,您的属性的排序不应该有任何区别 - 对于这种情况,您可能应该查看 Dictionary 否则。

【讨论】:

  • 这不会产生提问者请求的顺序。
  • stackoverflow.com/a/9062846/1086121 - 依赖订单是个坏主意
  • 对不起@canton7 但是发布一个符合OP想要的答案呢?恕我直言,这是做 OP 想要做的最接近的可能性。否则 OP 使用的结构(匿名类型)是错误的。他也许应该使用 SortedDictionary 或数组或其他东西..
  • OP 提出的问题没有解决方案:我无法发布任何内容来回答这个问题。就我个人而言,我认为这样的答案可能会或可能不会解决 OP 的问题,并且可能在未来的任何时候随机中断,需要附带一个警告,说明这一点。否则 OP 可能会认为这是一个真正的解决方案,并且正在为未来的一个令人讨厌的惊喜做好准备。
  • @canton7 :不,与您的想法相反,我承认您的所有评论。我完全理解这不是一个可靠的解决方案,我不会使用它。我将手动创建自己的列表。
猜你喜欢
  • 1970-01-01
  • 2012-01-23
  • 1970-01-01
  • 1970-01-01
  • 2018-11-12
  • 2022-11-02
  • 1970-01-01
  • 1970-01-01
  • 2012-05-01
相关资源
最近更新 更多