0

我正在编写一个使用反射从类中获取每个属性名称及其值的应用程序,System.Windows.Forms.SystemInformation我当前的代码是该线程的一个片段:

你如何循环一个类的​​属性?

马克的答案可能是最好的,但对我来说太复杂了,因为这是我第一次做反思,他的技能太高了。

所以这是我首先得到的。

foreach (PropertyInfo prop in typeof(System.Windows.Forms.SystemInformation).GetProperties())
{
    richTextBox1.AppendText(prop.Name + "\t\t" + prop.GetValue(null, null) 
}

但我不知道如何遍历类的属性powerstatus。我考虑过检查当前道具是否是原始类型。如果不是,我会递归调用上层函数。所以它看起来像这样:

private void readProperties(Type T, int indent)
{
    //var x = System.Windows.Forms.SystemInformation.ActiveWindowTrackingDelay;
    foreach (PropertyInfo prop in T.GetProperties())
    {
        for (int x = 0; x < indent; x++)
        richTextBox1.AppendText("\t");
        richTextBox1.AppendText(prop.Name + "\t\t" + prop.GetValue(null, null) +"\n");
        if (!prop.PropertyType.IsPrimitive)
            readProperties(prop.PropertyType, indent+1);
        //System.Windows.Forms.PowerStatus PS = new PowerStatus();
    }
}

但现在我得到了例外:“Die nicht-statische Methode erfordert ein Ziel”翻译为:“非静态方法需要一个目标”

第一次递归调用函数时会引发异常。该属性是 primaryMonitorSize ,它是 typeof Size。恕我直言,这与我正在解析类型Size而不是System.Windows.Forms.SystemInformation.primaryMonitorSize因为我知道实际类型但不知道它是我的程序的哪个成员这一事实有关,因为它也可能是 winForm 的大小。

那么我该如何解决这个问题呢?我感谢每一个建设性的批评。

@Edit:这是一个 msdn 示例。但它看起来并不漂亮。 http://msdn.microsoft.com/de-de/library/system.windows.forms.systeminformation.powerstatus.aspx?cs-save-lang=1&cs-lang=csharp#code-snippet-2

4

2 回答 2

3
 private void readProperties(Type T, int indent)

您需要改进此方法,它不适合读取 PowerStatus 属性的属性。这需要一个对象,您不能将null传递给 GetValue() 方法。所以改为这样写:

 private void readProperties(Type T, int indent, object obj) {
    //...
    var value = prop.GetValue(obj, null); 
    if (prop.PropertyType.IsPrimive) {
        richTextBox1.AppendText(prop.Name + "\t\t" + value.ToString() +"\n");
    }
    else {
        richTextBox1.AppendText(prop.Name + ":\n");
        readProperties(prop.PropertyType, indent+1, value);
    }
 }

注意它现在是如何读取属性值的,如果它是一个对象,那么它会再次将该对象传递给 readProperties,因此 GetValue() 将正常工作。传递 null 以启动 SystemInformation。

于 2013-06-12T12:49:53.803 回答
2

的所有属性System.Windows.Forms.SystemInformation都是静态的,这就是为什么您不必传递对象和

非静态方法需要一个目标

您的第一个代码示例中没有发生异常。对于非静态属性,调用GetValue(object obj, object[] index)方法时需要使用目标。

查看此控制台应用程序,注意在第二个foreach中,该GetValue方法实际上将SystemInformation.PowerStatus(目标实例)作为第一个参数:

class Program
{
    public static void Main()
    {
        var type = typeof(System.Windows.Forms.PowerStatus);
        foreach (PropertyInfo prop in type.GetProperties(
            BindingFlags.Static |
            BindingFlags.Public |
            BindingFlags.NonPublic))
        {
            Console.WriteLine(prop.Name + "\t\t"
                + prop.GetValue(null, null));
        }
        foreach (PropertyInfo prop in type.GetProperties(
            BindingFlags.Instance |
            BindingFlags.Public |
            BindingFlags.NonPublic))
        {
            Console.WriteLine(prop.Name + "\t\t" + prop.GetValue(
                System.Windows.Forms.SystemInformation.PowerStatus, null));
        }
    }
}
于 2013-06-12T11:41:45.213 回答