Метод C# для возврата типа

У меня есть несколько классов, которые идентифицируются некоторым ID (который является уникальным целым числом для каждого класса). Затем мне нужен метод, который принимает целое число (ID) в качестве аргумента и возвращает соответствующий тип класса. До сих пор я дошел до этого:

public static Type GetById(int id)
{
    switch (id)
    {
        case 1: return (new ClassA()).GetType();
        case 2: return (new ClassB()).GetType();
        case 3: return (new ClassC()).GetType();
        // ... and so on
    }
}

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

другое решение, которое я нашел, - использовать Тип.Метод gettype(classNameAsString) метод, но я думаю, что это может вызвать некоторые ошибки во время выполнения или ошибки в случае изменения имени класса (т. е. я меняю имя класса, но забыл обновить метод GetById).

есть ли лучший способ сделать это?

3 ответов


использовать typeof оператор вместо

public static Type GetById(int id)
{
    switch (id)
    {
        case 1: return typeof(ClassA);
        case 2: return typeof(ClassB);
        case 3: return typeof(ClassC);
        // ... and so on
    }
}

в качестве примечания я бы серьезно поставил под сомнение весь этот дизайн - странно сопоставлять типы с целыми числами.


почему бы вам просто не объявить словарь?

  private static Dictionary<int, Type> types = new Dictionary<int, Type>() {
    {1, typeof(ClassA)},
    {2, typeof(ClassB)},
    {3, typeof(ClassC)},
    ... and so on
  };

  public static Type GetById(int id) {
    Type result = null;

    if (types.TryGetValue(id, out result))
      return result;

    return null; // or throw exception
  }

Другой альтернативой было бы создание enum:

public enum ClassType
{
    ClassA = 1,
    ClassB = 2,
    ClassC = 3
}

а затем измените свой метод, чтобы принять это enum и вернуть типа:

public static Type GetById(ClassType id)
{
    //Will return null if the Type is not found, 
    //Add true as a second parameter to throw if not found
    return Type.GetType(id.ToString());
}

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