【问题标题】:how to make dictionary of a list using dynamic key in c#如何在 C# 中使用动态键制作列表的字典
【发布时间】:2013-12-14 02:46:29
【问题描述】:

我正在开发一个程序,我需要在其中创建一个字典,在其中我将在运行时传递一个字符串和一个列表,并且它必须使用该字符串作为键属性创建一个字典。

下面是类:

public class Tour
{
    public int Id{get;set;}
    public string Name{get;set;}
    public string City{get;set;}
}

这里是函数

public Dictionary<int,object> GetDictionary(string KeyName, List<object>)
{

}

我知道可以使用反射来完成,但我不知道该怎么做

【问题讨论】:

  • 你传递给它一个旅游列表吗?
  • 我想 OP 希望能够将其称为GetDictionary("Id", listOfTour)..
  • 你想在 List 中创建带有 Tour 对象 ID 的 Dictionary,并告诉我你要发送的对象是不是 Tour。
  • @RobertHarvey 不,它只是一个示例,我正在制作一个通用函数。
  • 你为什么要传递字符串 keyName 并返回 类型的字典

标签: c# .net generics reflection collections


【解决方案1】:

使用以下方法返回对象内类型的值

public static int GetPropValue(object src, string propName)
{
    return (int)src.GetType().GetProperty(propName).GetValue(src, null);
}

然后只需转换每个元素并获取键值并使用 ToDictionary 并在 lamda 表达式中调用此函数。

public Dictionary<int, object> GetDictionary(string KeyName, List<object> list)
{
    return list.ToDictionary(v => GetPropValue(v, KeyName));
}

【讨论】:

    【解决方案2】:

    我得到了解决方案,谢谢你的帮助:)

    这是所需的代码

    public class Tour
    {
        public int Id{get;set;}
        public string Name{get;set;}
        public string City{get;set;}
    }
    
    public Dictionary<int,object> GetDictionary(string KeyName, List<object> list)
    {
        var dictionary  = Dictionary<int,object>();
        foreach(var obj in list>
        {
             dictionary.Add(GetPropValue(obj,KeyName);
        }
        return dictionary;
    }
    
    public object GetPropValue(object src, string propName)
    {
         return src.GetType().GetProperty(propName).GetValue(src, null);
    }
    

    【讨论】:

      【解决方案3】:

      假设您在名为tours 的变量中有一个List&lt;Tour&gt;,您可以像这样得到一个Dictionary&lt;int, Tour&gt;

      var dictionary = tours.ToDictionary(k => k.Id);
      

      参考
      Enumerable.ToDictionary&lt;TSource, TKey&gt; Method

      【讨论】:

      • 我正在制作一个通用函数,因此我不知道类型,甚至我不知道键的名称,
      • 没关系。你可以用任何你想要的类型替换Tour,但是你需要从你的对象中指定一些字段作为 lambda 表达式中的键。
      • 如果它是通用类型,为什么您将密钥作为字符串发送。您是否要搜索密钥并返回与字典 相同的密钥值。为什么你提到了 string KeyName...
      • @VDN:我为你解决了这个问题。
      • @Robert Harvey:如果对象不包含 id 作为属性,那么我认为您提供的代码将无用。他不得不说Generic对象结构,以便我们可以提供代码来帮助......(希望你理解)
      猜你喜欢
      • 2016-05-23
      • 2017-01-14
      • 2016-02-03
      • 1970-01-01
      • 2012-04-18
      • 1970-01-01
      • 1970-01-01
      • 2014-10-10
      • 1970-01-01
      相关资源
      最近更新 更多