- テストコードの作成で、テスト対象のインスタンスのprivateフィールドの値を検証したい場合があります。
 - 対象インスタンスの型を取得し、Type.GetField()でフィールドの定義であるFieldInfoをできます。このオブジェクトのFieldInfo.GetValue([対象インスタンス], [フィールド名])で値を取得できます。
 - Type.GetField()を実行する際、適切なフラグも指定しないとフィールド定義を検索できません。
フラグの詳細はリファレンスを参照のこと。 - staticなフィールドを取得する場合、BindingFlags.Instanceではなく、BindingFlags.Staticを指定します。
 - フィールドではなくプロパティの値を取得する場合は、Type.GetProperty()を使用します。
 
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45  | public class PrivateClassTest {     [Fact(DisplayName = "privateフィールドの値を検査")]     public void Test_InspectPrivateField()     {         var target = new TargetClass();         target.start();         Assert.True(GetPrivateFieldValue<bool>(target, "_started"));     }     private static T GetPrivateFieldValue<T>(object target, string fieldName)     {         var type = target.GetType();         var flags =             BindingFlags.GetField |             BindingFlags.NonPublic |             BindingFlags.Instance;         var fieldInfo = type.GetField(fieldName, flags)             ?? throw new InvalidOperationException($"field not found: {fieldName}");         return (T)fieldInfo.GetValue(target);     } } public class TargetClass {     private bool _started = false;     public void start()     {         if (_started) throw new InvalidOperationException("already started");         _started = true;         // something to do...     }     public void end()     {         if (!_started) throw new InvalidOperationException("already end");         _started = false;         // something to do...     } }  |