Использование отражения для вызова статического метода в универсальном классе - PullRequest
1 голос
/ 11 марта 2012

У меня есть универсальный класс с неуниверсальным статическим методом, который выполняет некоторые операции с данным типом.

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();

Буду признателен за любую помощь.

Ответы [ 2 ]

0 голосов
/ 11 марта 2012

Если вы только что получили статический список типов (предупреждение - проверка не включена):

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);
}
0 голосов
/ 11 марта 2012

Мне кажется, что это очень странная вещь. Если вы хотите выполнить некоторую очистку, вы можете рассмотреть возможность использования нестатических классов или чего-то еще. Опять же, это действительно пахнет плохим дизайном для меня, но я не могу посоветовать вам лучший способ, потому что я до сих пор не знаю почему вы пытаетесь это сделать.

Если вы уверены, что хотите это сделать, то, похоже, нет способа получить список всех используемых типов напрямую. Но вы можете сохранить список всех используемых созданных типов в каком-то другом неуниверсальном типе и добавить к нему статический конструктор.

Но если все, что вы хотите сделать, это вызвать 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();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...