代码之家  ›  专栏  ›  技术社区  ›  Matt

在C中枚举对象的属性(字符串)#

  •  38
  • Matt  · 技术社区  · 15 年前

    假设我有许多对象,它们有许多字符串属性。

    有没有一种编程的方法来遍历它们并输出propertyname及其值,或者必须对其进行硬编码?

    是否有linq方法来查询'string'类型的对象属性并输出它们?

    是否必须硬编码要回显的属性名?

    5 回复  |  直到 5 年前
        1
  •  75
  •   Ben M    15 年前

    使用反射。它的速度远不及硬编码的属性访问,但它可以满足您的需要。

    以下查询为对象“myobject”中的每个字符串类型属性生成一个具有名称和值属性的匿名类型:

    var stringPropertyNamesAndValues = myObject.GetType()
        .GetProperties()
        .Where(pi => pi.PropertyType == typeof(string) && pi.GetGetMethod() != null)
        .Select(pi => new 
        {
            Name = pi.Name,
            Value = pi.GetGetMethod().Invoke(myObject, null)
        });
    

    用途:

    foreach (var pair in stringPropertyNamesAndValues)
    {
        Console.WriteLine("Name: {0}", pair.Name);
        Console.WriteLine("Value: {0}", pair.Value);
    }
    
        2
  •  12
  •   Martin Liversage    5 年前

    您可以通过使用 GetProperties 方法。然后可以使用LINQ筛选此列表。 Where 扩展方法。最后,可以使用LINQ来对属性进行投影。 Select 扩展方法或方便的快捷方式 ToDictionary .

    如果要将枚举限制为具有 String 您可以使用此代码:

    IDictionary<String, String> dictionary = myObject.GetType()
      .GetProperties()
      .Where(p => p.CanRead && p.PropertyType == typeof(String))
      .ToDictionary(p => p.Name, p => (String) p.GetValue(myObject, null));
    

    这将创建一个将属性名称映射到属性值的字典。因为属性类型仅限于 将属性值强制转换为 返回类型的类型是 IDictionary<String, String> .

    如果你想要所有的属性,你可以这样做:

    IDictionary<String, Object> dictionary = myObject.GetType()
      .GetProperties()
      .Where(p => p.CanRead)
      .ToDictionary(p => p.Name, p => p.GetValue(myObject, null));
    
        3
  •  3
  •   Michael Bray    15 年前

    你可以用反射来做这个…。有一篇像样的文章在 CodeGuru ,但这可能比你想要的要多……你可以从中学习,然后根据需要修剪它。

        4
  •  3
  •   Karl Wenzel    12 年前

    如果您的目标只是使用人类可读的格式输出存储在对象属性中的数据,那么我更喜欢将对象序列化为json格式。

    using System.Web.Script.Serialization;
    //...
    
    string output = new JavaScriptSerializer().Serialize(myObject);
    
        5
  •  -2
  •   Axl    15 年前

    像这样的怎么样?

    public string Prop1
    {
        get { return dic["Prop1"]; }
        set { dic["Prop1"] = value; }
    }
    
    public string Prop2
    {
        get { return dic["Prop2"]; }
        set { dic["Prop2"] = value; }
    }
    
    private Dictionary<string, string> dic = new Dictionary<string, string>();
    public IEnumerable<KeyValuePair<string, string>> AllProps
    {
        get { return dic.GetEnumerator(); }
    }