如何使用反射获取对象中的所有变量?

时间:2018-06-22 16:12:08

标签: c# dictionary reflection

我目前正在使用此代码来获取对象中的所有变量并将数据放置在Dictionary中(键是变量名,值是变量的内容)。

foreach (var property in PropertiesOfType<string>(propertiesJSON))
{
    dictionary.Add(property.Key, property.Value);
}

在这段代码中, propertiesJSON 是我需要的对象。这是PropertiesOfType方法:

public static IEnumerable<KeyValuePair<string, T>> PropertiesOfType<T>(object obj)
{
    return from p in obj.GetType().GetProperties()
           where p.PropertyType == typeof(T)
           select new KeyValuePair<string, T>(p.Name, (T)p.GetValue(obj));
}

当我对Dictionary进行任何数据测试时,没有任何值(我使用Visual Studio的调试工具进行检查,并且我的程序还打印出了Dictionary内的所有数据-当然不存在)。请告诉我我在这里犯的错误(我仍在学习编码,发布此书时我15岁。)

编辑:这是propertiesJSON的外观

var propertiesJSON = Newtonsoft.Json.JsonConvert.DeserializeObject<Models.PropertiesJSON>(content);

这是课程本身:

class PropertiesJSON
{
    public string botToken;
    public bool girl;
    public int age;
    public string[] hi;
    public string test;
}

谢谢。

1 个答案:

答案 0 :(得分:6)

那些不是属性!

这些:

public string botToken;
public bool girl;
public int age;
public string[] hi;
public string test;

是所有字段。如果它们是属性,它们将看起来像这样:

public string botToken { get; }
public bool girl  { get; }
public int age  { get; }
public string[] hi  { get; }
public string test  { get; }

要获取字段,请使用GetFields而不是GetProperties

return from p in obj.GetType().GetFields()
       where p.FieldType == typeof(T)
       select new KeyValuePair<string, T>(p.Name, (T)p.GetValue(obj));

我建议您将字段更改为所有属性。