代码之家  ›  专栏  ›  技术社区  ›  Jamie Dixon

循环访问对象中的已知属性

  •  1
  • Jamie Dixon  · 技术社区  · 15 年前

    我有一个包含30个属性的对象,我知道它们的名称。这些属性称为“valuex”(1-30),其中x是一个数字。

    如何在循环中调用value1-value30?

    4 回复  |  直到 15 年前
        1
  •  2
  •   tvanfosson    15 年前

    下面将把所有属性/值选择到一个匿名类型的IEnumerable中,该IEnumerable包含您感兴趣的属性的名称/值对。它假定属性是公共的,并且您是从对象的方法访问的。如果属性不是公共的,则需要使用bindingFlags指示您需要非公共属性。如果从对象外部,则替换 this 有兴趣的对象。

    var properties = this.GetType()
                         .GetProperties()
                         .Where( p => p.Name.StartsWith("Value") )
                         .Select( p => new {
                               Name = p.Name,
                               Value = p.GetValue( this, null )
                          });    
    
        2
  •  7
  •   David Basarab    15 年前

    使用反射。

    public static string PrintObjectProperties(this object obj)
    {
        try
        {
            System.Text.StringBuilder sb = new StringBuilder();
    
            Type t = obj.GetType();
    
            System.Reflection.PropertyInfo[] properties = t.GetProperties();
    
            sb.AppendFormat("Type: '{0}'", t.Name);
    
            foreach (var item in properties)
            {
                object objValue = item.GetValue(obj, null);
    
                sb.AppendFormat("|{0}: '{1}'", item.Name, (objValue == null ? "NULL" : objValue));
            }
    
            return sb.ToString();
        }
        catch
        {
            return obj.ToString();
        }
    }
    
        3
  •  3
  •   John Gietzen    15 年前

    您可以考虑改用集合或自定义索引器。

    public object this[int index]
    {
        get
        {
            ...
        }
    
        set
        {
             ...
        }
    }
    

    然后你可以说;

    var q = new YourClass();
    q[1] = ...
    q[2] = ...
    ...
    q[30] = ...
    
        4
  •  1
  •   Ian    15 年前

    您可以通过反射来实现这一点,获取类的propertyinfo对象并检查它们的名称。