-1

このコードでオブジェクトのすべてのインスタンスを取得します:

 Type type = this.GetType();
 FieldInfo[] fields = type.GetFields(BindingFlags.NonPublic |
                                     BindingFlags.Instance);  

しかし、インスタンスクラスのターゲットを取得し、これを持っていないEnabledため、ボタンなどのプロパティを変更できません。SetValueクラスの名前と種類だけがあります。次に、フィールドに存在するオブジェクトのプロパティ(有効)を変更する方法を説明します。

4

2 に答える 2

1

リフレクション コードを少し変更してみてください。1 つには、オブジェクトと、property具体的に必要な の両方を参照する必要があります。Propertyは と同じではないことに注意してくださいField

MyObject.GetType().GetProperty("Enabled").SetValue(MyObject, bEnabled, null);

MyObjectボタンやフォームなど、どんなタイプでも使用します...次に、プロパティを name で参照しEnabled、それを に対して元に戻しますMyObject

事前にプロパティを取得したい場合は、インスタンスを変数に格納できますが、プロパティはフィールドではないことに注意してください。

PropertyInfo[] piSet = MyObject.GetType().GetProperties();

を使用thisしてプロパティ セットを取得できますが、有効/無効にしようとしているコントロールthisと同じでない場合はお勧めできません。Type

編集を追加

質問を読み直した後、私はこれを理解しました。あなたが望んでいるように見えるのは、多層リフレクションとジェネリックです。探しているコントロールは、「this」に関連付けられた Field です。あなたができることは、これらの線に沿った何かです。

Type theType = this.GetType();
FieldInfo[] fi = theType.GetFields(BindingFlags.NonPublic | BindingFlags.Instance);
foreach ( FieldInfo f in fi)
{
    //Do your own object identity check
    //if (f is what im looking for)
    {
        Control c = f.GetValue(this) as Control;
        c.Enabled = bEnabled;
    }
    //Note: both sets of code do the same thing
    //OR you could use pure reflection
    {
        f.GetValue(this).GetType().GetProperty("Enabled").SetValue(f.GetValue(this), bEnabled, null);
    }
}
于 2013-02-25T17:30:51.000 に答える
0

まず、実際にオブジェクトのフィールドを使用しています。本当に書き込み可能なプロパティが必要な場合は、次のようなものが必要です。

PropertyInfo[] properties = type.GetProperties(Public | SetProperty | Instance);

それができたら、有効なプロパティを次のように設定できます。

myenabledPropertyInfo.SetValue(targetObject, value, null);

ここで、targetobject は関心のある Enabled プロパティを持つオブジェクトであり、value は割り当てたい値です (この場合、おそらくブール値...)

それが役立つことを願っています...

于 2013-02-25T17:31:20.260 に答える