2012-03-11 71 views
1

我有一個非泛型靜態方法的泛型類,它對所討論的類型執行一些操作。使用反射調用通用類的靜態方法

class MyClass<T> { 
    static List<T> _listOfStuff; 

    public static void DoX() { _listOfStuff.Clear(); } 
} 

而不是寫下面的代碼,我想使用反射和循環的泛型類型和調用DoX()。

請記住,類型列表可能會在將來增長,MyClass可以由維護此代碼的程序集外部的開發人員使用。我需要一個自動化的方式來獲得Type[]陣列int,string,TypeX

MyClass<int>.DoX(); 
MyClass<string>.DoX(); 
MyClass<TypeX>.DoX(); 

任何幫助,將不勝感激。

+1

你是什麼意思「註冊」?你爲什麼需要這樣的清單? – svick 2012-03-11 12:23:19

+0

我的歉意,我不確定什麼是正確的術語,但不是指定一個類型,我希望能夠在類運行時意識到的所有類型上調用DoX()。 – 2012-03-11 12:28:17

+0

沒有這樣的事情。該類不知道任何類型。如果你想獲得當前程序中曾經使用的所有類型參數,也許你想使用靜態構造函數。 – svick 2012-03-11 12:31:07

回答

0

在我看來,這是一件非常奇怪的事情。如果你想執行一些清理,你可能會考慮使用非靜態類或其他東西。再說一次,這對我來說確實有不好的設計氣味,但我不能告訴你任何更好的方法,因爲我仍然不知道爲什麼是你試圖做到這一點。

如果您確定要這樣做,似乎沒有辦法直接獲取所有使用的類型列表。但是你可以在其他非泛型類型中保存所有使用構造類型的列表,並從靜態構造函數中添加它。

但是,如果您只想爲所有類型調用DoX(),則實際上並不需要類型列表,對於所有使用的類型,您可以使用DoX()的代表列表。這可能是這個樣子:

class MyClass<T> 
{ 
    static MyClass() 
    { 
     MyClass.DoXDelegates.Add(DoX); 
    } 

    public static void DoX() { /* whatever */ } 
} 

static class MyClass 
{ 
    private static readonly List<Action> s_DoXDelegates = new List<Action>(); 
    internal static List<Action> DoXDelegates 
    { 
     get { return s_DoXDelegates; } 
    } 

    internal static void DoXForAll() 
    { 
     foreach (var doXDelegate in DoXDelegates) 
      doXDelegate(); 
    } 
} 
+0

知道其他開發人員如何使用我的庫是不可能的。問題是,我不知道泛型類型參數是什麼,我只需要知道哪些類正在使用的類。 – 2012-03-11 12:31:08

+0

爲什麼你需要知道這一點?也許有更好的方法來實現你想要的。 – svick 2012-03-11 12:31:54

+0

請參閱我更新的問題。 – 2012-03-11 12:34:08

0

假設,如果你拿到的類型(警告 - 不編譯選中)的靜態列表:

Type[] types = new[] { typeof(int), typeof(string), typeof(TypeX) }: 

Type myClass = typeof(MyClass<>); 

foreach (Type t in types) { 
    Type genMyClass = myClass.MakeGenericType(t); 
    genMyClass.InvokeMember("DoX", BindingFlags.Public | BindingFlags.Static, null, null, null); 
}