2012-03-11 90 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); 
}