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. システムエンジニアリング, 実装技術

関連記事

Excel VBAでJSONを自動生成

サンプルExcelシートの説明 Excelシート上に記載したフィールドや値をJSONに出力できます。 「配列」(I列)、「型」(J列)を変更することで、JSONへの値の出力仕様を変更できます。JSON …

Apacheでクライアント証明書認証の方法

概要 クライアント証明書認証を行うリバースプロキシサーバを構築する方法を説明します。 フロントのリバースプロキシサーバ、バックエンドにWebアプリを配置した構成を想定しています。 リバースプロキシサー …

WebアプリでのHTTP GETとPOSTの比較

はじめに 業務Webアプリの開発で、検索画面の実装でGETとPOSTのどちらを使用すべきか悩んだのでその整理で纏めています。 主に次の資料をベースに筆者独自の見解等を追記しています。 HTTP Req …

JavaにおけるFileとPathを使ったパス操作

サーバ側でのzipファイルの解凍等の際に、意図しないディレクトリやファイル(ディレクトリトラバーサル攻撃)へのアクセスを防ぐための検証として、絶対パスを正規化したい場合がある。 Fileクラスを使った …

slf4jで独自ログ項目を追加(MDC)

はじめに 業務要件、障害発生時の処理追跡や証跡等、ログ出力に特定項目を含めたい場合があります。 共通のログ出力ユーティリティやライブラリを作って、その中でログ出力内容を変更しても良いのですが、MDC( …