2010-03-14 22 views
0

SPL和PHP允許您從類創建對象,以滿足某些條件,例如實現某些接口和類似的東西。.net - 通過反射從特定命名空間的類中調用方法

不過,我想這樣做在C#中類似的東西,並自動在命名空間中創建的所有類的對象並調用從那些實現某個接口的類的特定方法。

我開發桌面應用程序的經驗非常有限。我不太確定我是否應該使用代表來存檔這個文件,或者如果反思真的是要走的路。

+0

什麼版本的.NET?問是因爲4.0支持動態對象。 – 2010-03-14 16:58:28

回答

3

那麼你必須使用反射 - 你可能使用代表,但它並不完全清楚;這將取決於你在做什麼。

Assembly.GetTypes()將返回一個組件內的所有類型;您可以使用Type.IsAssignableFrom()來檢查類型是否實現了一個接口或從其他特定類型的派生,Type.Namespace檢查命名空間等Activator.CreateInstance()將通過調用參數的構造函數(如果有的話),或者你可以調用創建類型的實例構造函數的參數使用其他過載CreateInstance或通過Type.GetConstructors()首先獲取。

如果你測試一個類型是否實現了一個接口,然後構建一個實例後,就可以把引用該接口,並調用這個接口中的方法不使用任何更多的反思。如果您只知道執行時的方法名稱,那麼您需要致電Type.GetMethod()以獲得MethodInfo,然後Invoke()來調用它。

所有這一切都有點容易出錯,而且複雜的過程的 - 如果你能找到靜態類型內停留的任何方式,這將使您的生活更輕鬆。這裏的大圖是什麼?你想達到什麼目的?

1

我不確定爲什麼你想要在類中實例化每種類型的實例,但是可以使用反射來實現它。另外,在程序集中實例化每種類型比在名稱空間中爲每種類型實現它更容易。無論如何,這裏有一個你可以做什麼樣:

var assembly = Assembly.GetExecutingAssembly(); //here you would retrieve the assembly you wish to search. 

foreach (var type in assembly.GetTypes()) 
{ 
    if (type.GetInterface("IMyInterface", true) != null) 
    { 
     var instance = Activator.CreateInstance(type) As IMyInterface; 
     instance.MethodIWantToCall(); 
    } 
} 
0

下面的代碼會發現,實現IDisposable,並有一定的命名空間下的所有類型。如果該類型是一個Form,則調用ShowDialog方法。

 Type[] types = System.Reflection.Assembly.GetExecutingAssembly().GetTypes(); 
     foreach (Type type in types) 
     { 
      if (type.Namespace.Equals("TestApp") && 
       (type.GetInterface("System.IDisposable") != null)) 
      { 
       object obj = Activator.CreateInstance(type); 
       if (obj is Form) 
        ((Form)obj).ShowDialog(); 
      } 
     } 
相關問題