2010-10-04 42 views
2

有没有一种方法来遍历所有属性从一个类的构造函数中,所以我可以设置自己的所有默认值,而不必列出每一个像如何遍历一个类的所有属性?

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. 
} 
+0

为什么你想这样做?你的答案极大地影响了答案。 – Gabe 2010-10-04 20:54:15

+0

我有一个类应该都具有相同的默认值的许多属性,但在阅读了回应并思考它之后,再一次在构造函数的一个属性中设置默认值会更清晰。 – etoisarobot 2010-10-05 13:27:24

回答

6

你可以用Reflection(通过Type.GetPropertiesPropertyInfo.SetValue)来做到这一点,但我不会推荐它。它会降低可读性和可维护性,并且会对性能产生负面影响。

列出属性并定义它们的初始值的好处是,您可以在构造函数中看到它。或者,您可以为您的属性提供后台字段,并在字段中内联定义它们。

0

做这样的事情。很棒。唯一的问题是你不能依靠订单。

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

} 

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

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

0

我不会推荐它,而是因为你都在问:

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

因私人设置属性失败。 – 2010-10-04 21:41:02

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]; 
    } 
} 
0

我可能不会推荐所有的属性设置为null以外的固定值...尤其是随着假设你的所有属性都对这个默认状态感到满意,并且甚至更多,你的类的用户很可能会期望空值(或者更确切地说,是default(T))代替未知值,这可能是天真的。

正如一个建议,如果这是为了显示“?”的好处,在特定值尚未知道的UI中,也许你可以在框架内使用合适的绑定类。

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

但是,如果你真的想沿着你所要求的路径走,那么就像上面所建议的那样,Type.GetProperties()应该可以做到。确保您考虑继承,抽象,重写或虚拟属性的情况,以及设置默认值是否合适 - 特别是考虑到标准设置/将值保留为空值/默认值(T)的情况实际上有一个已知的价值。