使用反射在泛型类上调用静态方法

时间:2012-03-11 12:18:40

标签: c# reflection

我有一个非泛型静态方法的泛型类,它对相关类型执行一些操作。

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

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

我不想编写下面的代码,而是使用反射和循环遍历泛型类型并调用DoX()。

请记住,类型列表将来可能会增长,并且MyClass可以由维护此代码的程序集外部的开发人员使用。我需要一种自动方式来获取Type[] intstringTypeX数组。

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

任何帮助都将不胜感激。

2 个答案:

答案 0 :(得分: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();
    }
}

答案 1 :(得分: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);
}