2010-05-18 44 views
3

我正在使用反射將自定義用戶控件加載到我的表單中。 我想我所有的用戶控件有一個「開始」和「結束」的方法,使他們都應該是這樣的:通過反射定義加載自定義用戶控件的界面

public interface IStartEnd 
{ 
    void Start(); 
    void End(); 
} 

public class AnotherControl : UserControl, IStartEnd 
{    
    public void Start() 
    { } 

    public void End() 
    { } 
} 

我想一個接口,通過反射來加載,但顯然不會工作,如下接口不能繼承一個類:

public interface IMyUserControls : UserControl, IInit, IDispose 
{ 

} 

回答

0

可以實施在運行時類實現IMyUserControls : IInit, IDisposeis UserControl約束。假設爲您的應用程序提供自定義控件的開發人員知道控件的需求是合理的,因此在運行時執行檢查時看不到問題。

1

我沒有看到用例,通過反射加載用戶控件需要知道控件的類型名稱。如果您自己動態加載了程序集,或者使用帶有Activator.CreateInstance的完整類型名稱,以便CLR可以確定需要加載的程序集,請使用Assembly.CreateInstance。

如果您想避免指定用戶控件類型名稱,那麼您可以使用Assembly.GetTypes()迭代加載的程序集並查找實現您的接口的類型。如果你以某種方式保證程序集只包含一個控件,這隻會很好地工作。

+0

爲什麼你認爲程序集應該只有1個用戶控件? – Burt 2010-05-18 15:31:12

+0

因爲否則會找到多個實現該接口的控件。你會選擇哪一個? – 2010-05-18 15:33:58

+0

看看我的答案如下: http://stackoverflow.com/questions/2857448/define-interface-for-loading-custom-usercontrols-through-reflection/2859106#2859106 – Burt 2010-05-18 16:22:32

0

這聽起來像你試圖做的是非常類似於棱鏡(和複合應用程序塊)採取的方法。有閱讀下面的文章給你的所涉及的想法:

還有的例子在那裏載荷和這種模式是非常廣泛使用。

我希望這會有所幫助。

B