NDW

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

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

関連記事

postgresqlでの拡張のインストール

PostgreSQL10で暗号化関数を使用するため拡張(pgcrypto)をインストールした際の出来事を記載します。 事象 pgcryptoの拡張をインストールしたり、インストールの確認を行うと、その …

.NET Core: Azure AD B2Cユーザアカウント操作のC#サンプル

概要 管理者がAzure AD B2Cのユーザアカウントの管理が行えるASP.NET Coreのアプリの開発を想定している。Azure AD B2Cユーザアカウントの作成や更新等の操作はMicroso …

パスワード情報の保管方式の比較

Webアプリの開発でパスワードを使ったユーザ認証を設計・実装する機会がよくある。 後輩への説明や勉強会ネタとして、この辺の話を纏めてみようと思う。 概要 オンラインバンキングやネットショッピングのサイ …

Azure AD B2Cの拡張属性とカスタム属性の違い

Azure AD B2Cのユーザアカウントを操作する際、拡張属性(ExtensionProperty)とカスタム属性(Custom Attribute)というキーワードがあり紛らわしい…と …

JSFラジオボタン・チェックボックスとbootstrap

boostrapでラジオボタンやチェックボックスを使用する場合、div, input, label要素にbootstrapのCSSクラスを指定する必要がある。 JSFでラジオボタンを使用する場合、se …