C#方法返回类型

6

我有一些通过唯一整数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
    }
}

目前看起来它工作正常,但出于某种原因我不喜欢必须实例化类才能获取其类型。这会导致任何问题吗?

我发现的另一种解决方案是使用Type.GetType(classNameAsString)方法,但我想如果类名称更改(即我更改类的名称,但忘记更新GetById方法),这可能会导致一些运行时错误或错误。

有更好的方法吗?


你是在尝试制作一个工厂吗? - Jonesopolis
不是的,我只需要这个类型,以便在底层 API 的通用方法中提供它。 - Jaroslav Loebl
3个回答

19

应使用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
    }
}
作为一则副笔记,我要严肃地质疑整个设计——将类型映射到整数感觉很奇怪。

这很奇怪吗?当枚举类型有N个值用于指定某种行为,而该行为由N个类提供时,需要考虑配置文件。您将希望将枚举值映射到这些类型。 - Gusdor
@Gusdor 我猜这并不是那么牵强附会。但是,这将把一个枚举映射到一个类型的实例,而不是将整数映射到Type - dcastro
啊,我理解你的保留意见。毕竟这很奇怪! - Gusdor
现在我感到很尴尬,因为我的记忆力不好,遗漏了typeof...谢谢,我会尽快接受答案。关于设计方面,我也不是很自信,但这是最容易完成任务而不需要进行重大重构的方法。 - Jaroslav Loebl
1
@Gusdor:在配置文件中,为什么不直接列出完整的类型名称呢?这就是.NET所做的。 - John Saunders

13

为什么不直接声明一个字典呢?

  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
  }

1
另一种选择是创建一个enum
public enum ClassType
{
    ClassA = 1,
    ClassB = 2,
    ClassC = 3
}

然后将您的方法更改为接受此枚举并返回该类型:

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

这样做可以消除代码中的魔法数字,但只有在类名与枚举选项匹配时才有效。这将使您的代码显著减小,但正如其他人所指出的那样,您确实应该质疑您的应用程序设计,因为这感觉不太对。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接