如何将类转换为Dictionary <string,string>?

Chi*_*tan 60 c# asp.net dictionary

现在我再次解释我对词典的热切期待!从我上一个问题的回答中,这个问题在我脑海中浮现!

现在实际的一点是我可以将类转换为字典吗?

在Dictionary中,我希望我的类属性为KEY,特殊属性的值为VALUE

假设我的班级是

public class Location
{
    public string city { get; set; }
    public string state { get; set; }
    public string country { get; set;
}
Run Code Online (Sandbox Code Playgroud)

现在假设我的数据是

city = Delhi
state = Delhi
country = India
Run Code Online (Sandbox Code Playgroud)

现在你可以轻松理解我的观点!

我想制作字典!那本字典应该是这样的

Dictionary<string,string> dix = new Dictionary<string,string> ();
dix.add("property_name", "property_value");
Run Code Online (Sandbox Code Playgroud)

我可以获得价值!但是我怎样才能得到属性名称(而不是价值)?

我应该编码什么来创建它动态!这应该适用于我想要的每一堂课?

你可以理解这个问题

我怎样才能从特定类中获取属性列表?

Mat*_*zer 146

这是配方:1个反射,1个LINQ到对象!

 someObject.GetType()
     .GetProperties(BindingFlags.Instance | BindingFlags.Public)
          .ToDictionary(prop => prop.Name, prop => prop.GetValue(someObject, null))
Run Code Online (Sandbox Code Playgroud)

自从我发表这个答案后,我检查过很多人发现它很有用.我邀请所有寻找这个简单解决方案的人来检查另一个Q&A,我将其推广到扩展方法:将对象映射到字典,反之亦然.

  • 当我尝试这样做时,它返回 Dictionary&lt;string, object&gt; 而不是 Dictionary&lt;string, string&gt;,因此不满足OP。 (2认同)
  • 虽然并非所有属性都会转换为字符串,所以也许最好这样做: `prop =&gt; prop.GetValue(o, null)?.ToString() ?? ”“` (2认同)

Bru*_*sta 19

这里有一个没有linq的反射示例:

    Location local = new Location();
    local.city = "Lisbon";
    local.country = "Portugal";
    local.state = "None";

    PropertyInfo[] infos = local.GetType().GetProperties();

    Dictionary<string,string> dix = new Dictionary<string,string> ();

    foreach (PropertyInfo info in infos)
    {
        dix.Add(info.Name, info.GetValue(local, null).ToString());
    }

    foreach (string key in dix.Keys)
    {
        Console.WriteLine("nameProperty: {0}; value: {1}", key, dix[key]);
    }

    Console.Read();
Run Code Online (Sandbox Code Playgroud)


Net*_*oke 10

public static Dictionary<string, object> ToDictionary(object model)
    {
        var serializedModel = JsonModelSerializer.Serialize(model);
        return JsonModelSerializer.Deserialize<Dictionary<string, object>>(serializedModel);
    }
Run Code Online (Sandbox Code Playgroud)

我已经使用了上面的代码。尽可能简化,它可以在没有反射的情况下工作,并且模型可以嵌套并且仍然可以工作。(如果您使用 Json.net,请将代码更改为不使用 Newtonsoft)