2012-05-30 33 views
2

可能重複:
How to call protected constructor in c#?中調用保護類的構造函數在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 
     } 
    } 
} 

我想打電話給 「ClassA的」 從 「ClassB的」 受保護的構造函數,那怎麼辦?請幫幫我。

+5

只有'classb'派生自'classa'時纔有可能。 http://msdn.microsoft.com/en-us/library/bcd5672a%28v=vs.80%29.aspx –

回答

3

如果

  • classaclassb在同一個裝配
  • 您在創作這兩個類
  • 你試圖保護classa的構造。

然後你可以聲明構造函數爲protected internal

0

這是不可能的,除非classb來自classa。受保護使得構造函數僅對類本身以及從classa派生的每個類都可見。

看看這裏:Protected C#

0

你的問題的this one重複。
除了從ClassA的推導,反射是一個有用的選擇(由quering所述類不的構造函數,然後在運行合適的一個,如在提供的鏈接的答案中的一個解釋)

1

以安全的方式這樣做是爲了添加一個繼承自classb的代理類,並帶有一個帶有字符串的公共構造函數。受保護的合同是明確的。

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

另一種方法是使用反射。很誠實我不建議這樣做,因爲當作者將構造函數設置爲受保護的時,它只能被自身和派生類使用。您也緊密耦合到未明確定義的「合同」。

話雖這麼說,這應該爲你的工作,雖然它會像筆者改變了合同的非保障部分(使用需要您自擔風險),一旦突破:

var constructor = typeof(classa).GetConstructors(BindingFlags.NonPublic | BindingFlags.Instance); 
var b = constructor.First().Invoke(new object[] {"hi"}); 
+0

-1給OP一個大紅色的按鈕,然後告訴他不要按下它。 – Servy

+0

@Servy在顯示如何做危險事情時給出警告是一個壞主意? – cadrell0

+0

@ cadrell0不,最好不要向某人展示如何做一些危險的事情,而不是說「你需要從類繼承來使用該構造函數」,而忽略任何黑客來訪問它。 – Servy

2

您可以使用反射來得到你想要從類型的元數據調用構造函數的引用:

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

一旦你必須構造參考,你可以調用它,傳入的參數,你想給構造函數對象的數組:

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

話雖這麼說,構造可能是受保護的原因,並使用反射來規避類型成員的封裝通常不是一個好理念。

相關問題