如何遍历类的所有属性?

时间:2010-10-04 20:41:22

标签: c#

有没有办法在类的构造函数中循环遍历所有属性,这样我就可以设置所有默认值而不必列出每个属性,如

this.prop1 = "?";
//repeat for each prop

例如:

public class thisClass()
{
    library()
    {
        foreach (property as p in thisClass)
        {
           p.value = "?";
        }
    }

public string prop1 {get; set;}
public string prop2 {get; set;}
etc.
} 

5 个答案:

答案 0 :(得分:6)

您可以使用反射(通过Type.GetPropertiesPropertyInfo.SetValue)执行此操作,但我不会推荐它。它会降低可读性和可维护性,并对性能产生负面影响。

列出属性并定义其初始值的优点是,您可以在构造函数中直接看到它。或者,您可以为属性提供支持字段,并在字段上内联定义它们。

答案 1 :(得分:1)

我不会这样做,真的。属性应该由构造函数显式初始化,这就是它们存在的原因。不要忘记初始化字段。

但我不知道你为什么需要它,所以这里有一些代码。

可靠地设置任何属性(包括私有属性)并不容易。通常我会这样做(从我的头脑中,明天我将检查我的真实代码):

var properties = this.GetType().Properties(
  BindingFlags.Instance 
  | BidningFlags.NonPublic 
  | BindingFlags.Public);

foreach(PropertyInfo property in properties)
{
    // if a property is declared on a base type with a private setter,
    // get the definition again from the declaring type,
    // unless you can't call the setter.
    // Probably it is even more reliable to get the properties setter
    // from the declaring type.
    if (property.DeclaringType != this)
    {
      property = property.DeclaringType.GetProperty(
        property.PropertyName,
        BindingFlags.Instance 
        | BidningFlags.NonPublic 
        | BindingFlags.Public);
    }

    if (property.CanWrite)
    {
      // assumed that you define a dictionary having the default values.
      property.SetValue(this, defaultValues[property.PropertyType];
    }
}

答案 2 :(得分:0)

做这样的事情。效果很好。唯一的问题是你不能依赖订单。

var properties = typeof(T).GetProperties();
foreach(var prop in properties ){

}

来自horses mouth GetProperties方法不会按特定顺序返回属性,例如按字母顺序或声明顺序。您的代码不得依赖于返回属性的顺序,因为该顺序会有所不同。

也就是说,通过手动分配所有属性,您的问题更好(如在软件设计更好中)。如果您发现自己处于具有太多属性的情况,则应使用容器。例如,List<>

答案 3 :(得分:0)

我不推荐它,但是因为你问:

var props = GetType().GetProperties().Where(prop => prop.CanWrite && prop.PropertyType == typeof(string))
foreach(var prop in props) 
    prop.SetValue(this, "?", null);

答案 4 :(得分:0)

我可能不会建议将所有属性设置为除null之外的固定值...特别是因为假设您的所有属性都对该默认状态感到满意而且可能更加天真,尤其是您的用户class很可能期望为null(或更精确地default(T))来代替未知值。

正如一个建议,如果这是为了显示“?”在UI中,当尚未知道特定值时,您可以在框架中使用适当的绑定类。

例如,winforms Binding类具有“NullValue”属性,当数据源中包含null或DbNull.Value时,该属性将传递给绑定控件的属性。

但如果你真的想沿着你所要求的路走下去,如上所述,Type.GetProperties()应该可以解决问题。确保考虑继承,抽象,重写或虚拟属性的情况以及设置默认值是否合适 - 特别是考虑到规范设置/将值保留为null /默认值(T)实际上有一个已知值。