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。現在の小道具がプリミティブ型かどうかを確認することを考えました。そうでない場合は、upperfunction を再帰的に呼び出します。したがって、次のようになります。

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」は次のように翻訳されました:「非静的メソッドにはターゲットが必要です」

関数が初めて再帰的に呼び出されると、例外がスローされます。属性は typeof である primaryMonitorSize ですSizeSizeそれは私がタイプを解析しているという事実と関係があり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 プロパティのプロパティを読み取るのには適していません。オブジェクトが必要なため、GetValue() メソッドにnullを渡すことはできません。したがって、代わりに次のように記述します。

 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() は正しく機能します。SystemInformation に対してこれを開始するには、null を渡します。

于 2013-06-12T12:49:53.803 に答える
2

のすべてのプロパティSystem.Windows.Forms.SystemInformationは静的です。そのため、オブジェクトを渡す必要がなく、

非静的メソッドにはターゲットが必要です

最初のコード サンプルでは例外は発生しません。静的ではないプロパティについては、メソッドを呼び出すときにターゲットを使用する必要がありますGetValue(object obj, object[] index)

foreachこのコンソール アプリケーションを確認してください。2 番目の では、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 に答える