【问题标题】:C# - Object List to DictionaryC# - 对象列表到字典
【发布时间】:2018-01-03 23:16:45
【问题描述】:

有没有办法将列表中每个对象的键值分配给字典?我想稍后访问该字典以将值分配给类的属性。

我从带有内部连接的 BD 中获取一些值,然后将这些值存储在对象列表中:

IEnumerable<object> units = _unitDetailsQuery.Execute<object>(out totalRecords);

每个对象都有以下属性:

  • 品牌(字符串)
  • 型号(字符串)
  • 代码(字符串)
  • BranchId (int)

然后我创建一个字典

IDictionary<string, object> props = new Dictionary<string, object>();

我在另一个问题中看到过类似这样的内容(我已将 sn-p 改编为我的代码):

BindingFlags bindingAttr = BindingFlags.DeclaredOnly | BindingFlags.Public | BindingFlags.Instance;
        foreach (object unit in units)
        {
            props = unit.GetType().GetProperties(bindingAttr).ToDictionary
                (
                    propInfo => propInfo.Name,
                    propInfo => propInfo.GetValue(unit, null)
                );
        }

但是 props 在赋值后没有任何价值。

对象内部是这样的:

那么我如何获得这些值呢?提前致谢。

【问题讨论】:

  • 您的样本中的“关键值”是什么?
  • @EvanTrimboli,因为其中一些属性来自其他表,如果我将它们添加到 steament 主表的模型中,它将影响映射。
  • 可能值得一提的是哪种 ORM/代码 Execute 可能是
  • @NetMage 键值是我列出的属性的值。这些属性是对象的非公共成员。
  • Afaik 也很难弄清楚你要做什么以及为什么要这样做。在我看来,无论如何,每个单元的字典都会被覆盖

标签: c# list object dictionary


【解决方案1】:

您可以使用此扩展方法,该方法将反映对象的公共属性并将它们放入字典中。

public static class ObjectExtensionMethods
{
    static public Dictionary<string, object> ToPropertyDictionary(this object o)
    {
        var d = new Dictionary<string, object>();
        foreach (var p in o.GetType().GetProperties(BindingFlags.Instance | BindingFlags.Public))
        {
            d.Add(p.Name, p.GetValue(o));
        }
        return d;
    }
}

您可以像这样在对象列表中使用它:

var listOfDictionaries = listOfObjects.Select( o => o.ToPropertyDictionary() );

【讨论】:

    【解决方案2】:

    感谢@John Wu,但既然您说您希望信息是可编辑的,我认为扩展方法必须返回字符串 System.Reflection.PropertyInfo。这样,可以更新和选择属性。

        public static Dictionary<string, System.Reflection.PropertyInfo> ToPropertyDictionary(object o)
        {
            var d = new Dictionary<string, System.Reflection.PropertyInfo>();
            foreach (var p in o.GetType().GetProperties(BindingFlags.Instance | BindingFlags.Public))
            {
                d.Add(p.Name, p);
            }
            return d;
        }
    

    这样,您可以获取/设置原始对象的属性。它不再是扩展方法。

    这样,您可以像这样编辑对象。假设我有一个名为 o 的随机对象,其中一个名为 X 的变量是一个整数。

    然后,我可以得到字典。

    var dict = ToPropertyDictionary(o);
    

    可以通过以下方式将 X 设置为 2:

    dict("X").SetValue(o, 2);
    

    然后得到 X 将完成:

    dict("X").GetValue(o)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-10-17
      • 2016-11-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-18
      • 1970-01-01
      相关资源
      最近更新 更多