2011-07-15 62 views
0

我有一個WinForms應用程序,例如具有2種不同類型的對象和一種常見表單。獲取實例化表單的類型,從該表單中獲取

Public Class A: 
{ 
    private MyForm formA = new MyForm(); 
    public void ShowForm() 
    { 
     formA.ShowDialog(); 
    } 
} 

Public Class B: 
{ 
    private MyForm formB = new MyForm(); 

    public void ShowForm() 
    { 
     formB.ShowDialog(); 
    } 

} 

Public class MyForm : Form 
{ 
} 

有沒有辦法從MyForm類中反射地告訴哪些類正在顯示MyForm?

回答

3

不是真的,好吧,也不是沒有走路的痕跡,這是最好的黑客。

更改您的形式構造採取Type參數,並有父類通過它自己的類型:

new MyForm(typeof(B));

+0

嗯那就是我害怕,猜測我的構造函數週圍生病變化然後。謝謝。 – user501211

0

你可以添加一個屬性myForm的,其中包含類型設置。

1

是的,但它的黑客,你不應該這樣做!

也就是說你可以通過StackTrace類做到這一點:

StackTrace stackTrace = new StackTrace(); 
if (stackTrace.GetFrame(1).GetMethod().DeclaringType.Name == "A") 
{ 
    // Class A called us 
} 

我們要求的堆棧跟蹤第一個堆棧幀(第0棧幀是當前的),因爲我們是方法之後稱這種方法。您可以使用GetMethod調用返回的MethodBase實例的其他屬性來查找其他信息,例如方法名稱。

好得多這樣做的方法是修改構造函數以接受額外的參數來修改窗體的行爲。 這些參數應封裝表格的行爲,例如,您可能希望傳遞布爾標誌來指示某些控件是否被禁用,或者是用於自定義表單標題的文本字段。

您不應該根據調用者來改變表單的行爲,因爲這會使得在其他情況下重用表單變得更加困難。

0

如果你是顯示從某種控制形式,調用的ShowDialog通過呼叫控制作爲所有者參數:

formA.ShowDialog(this); 

然後MyForm的類中,你可以檢查所有者屬性,看看誰把它稱爲並獲得呼叫者的類型

Owner.GetType();