C# でクラス外からプライベート コンストラクターにアクセスする 質問する

C# でクラス外からプライベート コンストラクターにアクセスする 質問する

プライベート デフォルト コンストラクターとパラメーターを持つパブリック コンストラクターを持つクラスを定義する場合、プライベート コンストラクターにアクセスするにはどうすればよいでしょうか?

public class Bob
{
   public String Surname { get; set; }

   private Bob()
   { }

   public Bob(string surname)
   {
      Surname = surname;
   }
}

次のように、クラスの静的メソッドを介してプライベート コンストラクターにアクセスできます。

public static Bob GetBob()
{
   return new Bob();
}

(私の理解では)拡張メソッドは次のように翻訳されるので、拡張メソッドを介してプライベートコンストラクタにアクセスできると考えました。そう見えるクラスの静的メソッドを作成したいのですが、できません:

static class Fred
{
   public static Bob Bobby(this Bob bob)
   {
      return new Bob();
   }
}

では、プライベート コンストラクターにアクセスするにはどうすればよいでしょうか?

ありがとう


編集:

私がこれをやりたかった理由は、ビジネス クラスの 1 つにテストを作成し、このクラスのコンシューマーがオブジェクトを誤ってインスタンス化できないようにしたかったからです。テスト中なので、どのような状況でテストが失敗するかはわかっています (そう願っています)。私はまだテストの初心者なので、私のアイデアが「間違った方法」だったかどうかはわかりません。

私はテスト戦略を変更して、このクラスの消費者が行うのと同じ方法で物事を行うようにしました。つまり、パブリックメソッドを呼び出し、パブリックメソッドがOKであれば、プライベートメソッドもOKであると想定します。私はまだプライベートメソッドをテストしたいのですが、私の上司は成果物に関して私の首を絞めている :-(

ベストアンサー1

新しい答え(9年後)

現在、いくつかのオーバーロードがありますアクティベーター.CreateInstance非公開コンストラクタの使用を可能にします:

Activator.CreateInstance(typeof(YourClass), true);

true= 非パブリックコンストラクターを使用します。

古い回答

デフォルト コンストラクターがプライベートであるのには理由があります。開発者が楽しみのためにプライベートにするわけではありません。

ただし、デフォルトのコンストラクターを引き続き使用したい場合は、リフレクションを使用して取得します。

var constructor = typeof(Bob).GetConstructor(BindingFlags.NonPublic|BindingFlags.Instance, null, new Type[0], null);
var instance = (Bob)constructor.Invoke(null);

編集

テストに関するコメントを見ました。保護されたメソッドやプロパティ、またはプライベートなメソッドやプロパティをテストしないでください。パブリック API を通じてそれらのメソッドやプロパティをテストできない場合は、おそらく何か間違ったことをしているでしょう。それらを削除するか、クラスをリファクタリングしてください。

編集2

バインディングフラグを忘れました。

おすすめ記事