2013-12-17 7 views
5

名前付きboolメンバーがたくさんある構造体があります。 (例のために、今は良い習慣などを残しておいてください)。リフレクションを使用してオブジェクトのすべてのboolメンバーを設定する

テスト目的のために、これらの値をtrueまたはfalseにランダムに設定したいとします。

どのように反射することができますか?

これは私がこれまで持っているものです。

 Random r = new Random(); 
     foreach (var bool_field in state.GetType().GetFields().Where(x => x.GetType() == false.GetType())) 
     { 
      bool_field.SetValue(state, r.Next() % 2 == 0 ? true : false); 
     } 

は残念ながら、それはループに入ることはありません。

UPDATE 1:

ここではSYSTEMSTATE構造体が状態変数の型である、どのように見えるかです。ブールオートプロパティでいっぱいです。

public struct SystemState 
{ 
    ... 
    public bool CanYouHelpMeOnThisOne { get; set; } 
    ... 
} 

UPDATE 2:

下記掲載ソリューションはいいようだが、それは動作しません。理由は、SystemStateがクラスではない構造体であるためです。そのため、参照型ではなくValue型であるため、SetValueメソッドの呼び出しは無効です。 SystemStateをクラスに変更すると、以下の解決策が完全に機能します。

SystemStateをクラスに変更せずにこれを達成するには他の方法がありますか?あなたはWhere句変更する必要がまず

+1

@horgh:彼はそこにいくつかの 'bool'メンバーがあると仮定します。 –

+1

ちょっとした注意:コンパイル時に 'Boolean'フィールドを設定することを知っているので、' false.GetType() 'ではなく' typeof(Boolean) 'を使用します。 –

答えて

8

:最後のOPの編集が、それはそこにフィールドが、プロパティではありませんのでxの種類として

x => x.FieldType == false.GetType() 

FieldInfo


です。したがって、GetPropertiesを使用してプロパティのリストを取得し、xPropertyInfoとなるので、PropertyTypeを比較する必要があります。また、SetValueメソッドは、別の署名を持つつもりです。 OPのコメントに基づいて

foreach (var bool_field in state.GetType() 
           .GetProperties() 
           .Where(x => x.PropertyType == false.GetType())) 
{ 
    bool_field.SetValue(state, r.Next() % 2 == 0 ? true : false, null); 
} 

、あなたはバッキングフィールドにアクセスしたい場合は、次のコードを使用することができます:

var fs = state.GetType() 
       .GetFields(BindingFlags.Instance | BindingFlags.NonPublic) 
       .Where(x => x.FieldType == typeof(bool)); 
foreach (var f in fs) 
{ 
    f.SetValue(state, true); 
} 
は、引数なし GetFieldsの過負荷がすべてのpublicフィールドを返します

を現在のタイプのあなたの場合はprivateのものが必要ですが、Type.GetFields Method (BindingFlags)には適切なBindingFlagsを付けてください。

+0

私が知っている限り、アセンブリレベルでは、それぞれのautoプロパティに1つのバッキングフィールドがあります。それらはTypeのGetFields()メソッドによって選択されていませんか? – VSZM

+0

あなたは現在のコードでそれを簡単にチェックすることができます....'x.GetType()'を 'x.FieldType'に変更することを忘れないでください – horgh

+0

それだけでは、バッキングフィールドで直接作業することはまったくうまくいかないようです。 – horgh

関連する問題