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

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

執筆者:

関連記事

保守運用

運用 と 保守 の 違い

若い頃は 運用 と 保守 の違いを調べても良くわからなかった… この辺を使い分けられる人をほとんど見たことない… ある事項が運用なのか保守なのかの話をすると認識が合わない&#8 …

ASP.NET Core: IHttpClientFactoryのサンプル

前回の記事でIHttpClientFactoryの使用方法を説明しました。 ここでは、サンプルを使用した具体的な使用方法を説明します。 前提 マイクロソフトが推奨するIHttpClientFactor …

Javaでサポートする暗号化アルゴリズム

Java暗号化アーキテクチャ Javaで暗号化処理を実装する場合、Java暗号化アーキテクチャ(Java Cryptography Architecture: JCA)と呼ばれるフレームワークを使いま …

JavaでのZIP暗号化の考察

法務系業務を行うシステムを設計するにあたり、次のような要件がありました。 CSVファイルの暗号化方式として、当初からパスワード付きZIPファイルの使用を検討していたため、ZIP圧縮を使用する前提で調査 …

VBAでケバブ・スネーク・パスカル・キャメル変換

開発の現場では、Excelに定義したクラスやテーブル等の設計内容に基づいて、VBAで自動的にソースコードやSQL文等の成果物を生成したい場合があります。この処理を実装する場合、Excel上の項目名を、 …