Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/273.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何循环一个类的所有属性?_C# - Fatal编程技术网

C# 如何循环一个类的所有属性?

C# 如何循环一个类的所有属性?,c#,C#,有没有一种方法可以循环遍历类构造函数中的所有属性,这样我就可以设置它们的所有默认值,而不必像这样列出每个属性 this.prop1 = "?"; //repeat for each prop 例如: public class thisClass() { library() { foreach (property as p in thisClass) { p.value = "?"; } } publ

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

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

您可以通过反射(通过和)来实现这一点,但我不推荐这样做。它将降低可读性和可维护性,并对性能产生负面影响


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

执行类似操作。效果很好。唯一的问题是你不能依赖秩序

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

}
从:GetProperties方法不按特定顺序返回属性,如字母顺序或声明顺序。您的代码不能依赖于返回属性的顺序,因为该顺序是不同的


也就是说,只需手动分配所有属性,您的问题就会得到更好的解决(如在软件设计中更好)。如果您发现自己的属性太多,那么应该使用容器。例如,一个
列表

我不推荐它,但既然你在问:

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

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

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

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


我可能不建议将所有属性设置为除null以外的固定值。。。特别是,假设您的所有属性都对该默认状态感到满意可能是幼稚的,甚至更幼稚的是,您的类的用户很可能期望null(或者更准确地说,
default(T)
)代替未知值

作为建议,如果这是为了在特定值未知时在UI中显示“?”,那么也许您可以在框架中使用适当的绑定类

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


但是,如果您真的想沿着您要求的路径走下去,正如上面所建议的那样,
Type.GetProperties()
应该可以做到这一点。请确保您考虑继承、抽象、重写或虚拟属性的情况,以及是否设置默认值是合适的-特别是考虑到当您没有实际值时,将规范设置为/将值设为null /默认值(t)。

您为什么要这样做?你的答案对答案有很大影响。我有一个类,它有许多属性,所有属性都应该具有相同的默认值,但是在阅读响应并进一步思考之后,在构造函数中一次设置一个属性会更清楚。使用私有setter属性失败。
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];
    }
}