NDW

アプリ開発やトラブルシューティング等のノウハウ、キャンプや登山の紹介や体験談など。

.NET Core 1. システムエンジニアリング 実装技術

.NET Core(C#): privateフィールドの値の取得方法

投稿日:2020年11月7日 更新日:

  • テストコードの作成で、テスト対象のインスタンスのprivateフィールドの値を検証したい場合があります。
  • 対象インスタンスの型を取得し、Type.GetField()でフィールドの定義であるFieldInfoをできます。このオブジェクトのFieldInfo.GetValue([対象インスタンス], [フィールド名])で値を取得できます。
  • Type.GetField()を実行する際、適切なフラグも指定しないとフィールド定義を検索できません。
    フラグの詳細はリファレンスを参照のこと。
  • staticなフィールドを取得する場合、BindingFlags.Instanceではなく、BindingFlags.Staticを指定します。
  • フィールドではなくプロパティの値を取得する場合は、Type.GetProperty()を使用します。
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...
    }
}






-.NET Core, 1. システムエンジニアリング, 実装技術

関連記事

ASP.NET Core: IHttpClientFactoryの単純サンプル

IHttpClientの使い方やサンプルの記事を書きましたが、後から見るとちょっと量が多いと感じました。 とりあえず動かしてみたい、概略を知りたい、急いでいる等の人向けに、もっと単純なサンプルを用意し …

Logicool MX Keys(KX800)でキー入力が遅延する

事象 次のようにデスクトップPC(Windows10)にUSBレシーバ+MX Keys(KX800)環境で、キー入力が遅延する事象が時々発生します。 ミリ秒レベルの若干の入力遅延がある。入力できないわ …

.NET Core(C#): xUnitのAssert使用方法

はじめに 次の環境を使用して動作確認しています。 OS Windows 10(64ビット) IDE Microsoft Visual Studio Community 2019(16.8.5) + C …

ASP.NET Core: エラーメッセージの日本語化

ASP.NET Coreでは入力値を検証するための[Required]等の検証属性が提供されていますが、エラーメッセージが英語になっています。 検証属性以外でも画面の実装方法によってはモデルバインディ …

ASP.NET Core: エラーメッセージ一覧のカスタマイズ

ASP.NET Core標準のasp-validation-summary属性では単純なエラーメッセージの一覧しか出力しかできません。 ここでは、asp-validation-summary属性と同様 …