アプリ開発ときどきアウトドア

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

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

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

投稿日:

  • テストコードの作成で、テスト対象のインスタンスの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...
    }
}


(adsbygoogle = window.adsbygoogle || []).push({});


(adsbygoogle = window.adsbygoogle || []).push({});

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

執筆者:

関連記事

WindowsでQRコードを生成(VBScript)

概要 Windows環境でVBScriptを使用してQRコードを生成する方法を紹介します。 このVBScriptは、Excelを起動し、バーコードコントロールを使ってQRコードを生成しています。 動作 …

JavaEE7のJSF, Facelets, JSPの関係

JavaEEを使ったアプリ開発の際に、いつも気になるが後回しにしていたこと… HTML5への対応方法の調査等、今後の理解促進のために、調べてみた。 FaceletsとJSFとの関係は? J …

Javaでのパスワード付きzipファイルの圧縮/解凍方法(ZipCrypto/AES)

先日、JavaでのZIP暗号化の考察という記事を書きましたが、zip4jのメンテナンスが再開されており、バージョン2系が公開されていましたので、これを使って通常のzip圧縮/解凍、パスワード付きzip …

ASP.NET Core: CreditCard属性のjavascriptエラー

Visual Studio 2019でASP.NET Coreプロジェクトを作成して[CreditCard]属性を使用すると、クライアント側で次のエラーが発生します。 Uncaught TypeErr …

リバースプロキシでのクライアント証明書認証

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