2

重複の可能性:
c# で保護されたコンストラクターを呼び出す方法は?

私は自分の問題の解決策を探しました。
実際、それが可能かどうかはわかりません。私を助けてください。

namespace namespace1
{
    namespace namespace1a
    {
        public class classa
        {
            protected classa(string i) //protected constructor
            {
                //Do something
            }
            public classa() //public constructor
            {
                //Do something
            }

        }
    }

    namespace namespace1b
    {
        public class classb
        {
            classa i = new classa(); // calls public constructor of classa

            classa j = new classa("hi"); //Invalid. How to call the protected constructor of classa
        }
    }
}  

「 classb」から「classa 」の保護されたコンストラクターを呼び出したいのですが、どうすればよいですか? 私を助けてください。

4

5 に答える 5

3

もしも

  • classaclassb同じアセンブリ内にある
  • 両方のクラスを作成しています
  • classaのコンストラクターを保護しようとしています。

protected internal次に、代わりにコンストラクターを宣言できます。

于 2012-05-30T17:12:20.277 に答える
2

リフレクションを使用して、型のメタデータから呼び出したいコンストラクターへの参照を取得できます。

var ctor = typeof(classa).GetConstructor(BindingFlags.NonPublic | BindingFlags.Instance, null, new[] { typeof(string) }, null);

コンストラクターへの参照を取得したら、それを呼び出して、コンストラクターにオブジェクトの配列として与えたい引数を渡します。

var instance = (classa)ctor.Invoke(new object[] { "Chicken butt" });

そうは言っても、コンストラクターはおそらく何らかの理由で保護されており、リフレクションを使用して型のメンバーのカプセル化を回避することは、一般的には良い考えではありません。

于 2012-05-30T17:05:24.463 に答える
1

これを行う安全な方法はclassb、文字列を受け取るパブリック コンストラクターを継承するプロキシ クラスを追加することです。保護されたコントラクトは明確に定義されています。

class bproxy : classb
{
     public bproxy(string x) : base(x) {...}
}

別の方法は、リフレクションを使用することです。正直なところ、これを行うことはお勧めしません。作成者がコンストラクターを保護されたものとして設定すると、それ自体と派生クラスでのみ使用されることを意図しているからです。また、明示的に定義されていない「契約」にも密接に結合しています。

そうは言っても、作成者が契約の非保証部分を変更するとすぐに壊れますが、これはうまくいくはずです( USE AT YOUR OWN RISK):

var constructor = typeof(classa).GetConstructors(BindingFlags.NonPublic | BindingFlags.Instance);
var b = constructor.First().Invoke(new object[] {"hi"});
于 2012-05-30T17:01:40.380 に答える
0

あなたの質問はこれと重複しています。
クラスから派生することを除いて、リフレクションは便利なオプションです(提供されたリンクの回答の1つで説明されているように、tpyeのコンストラクターを照会してから適切なコンストラクターを実行することにより)

于 2012-05-30T16:59:16.393 に答える
0

classb が classa から派生しない限り、これは不可能です。Protected は、クラス自体と classa から派生したすべてのクラスだけがコンストラクターを認識できるようにします。

ここを見てください: Protected C#

于 2012-05-30T16:50:20.743 に答える