You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过字面量实例化System.Type类型的列表?

解决获取Type对象存入List的最优方案

嘿,太懂你这种不想折腾实例化或者魔法字符串的心情了!其实C#里早就给我们准备了最简洁靠谱的方式——typeof运算符,这才是获取System.Type对象的标准操作,完全能解决你的痛点。

先说说你之前尝试的几种方法为啥不行:

  • 直接写ClassA:这只是类型的名称标识,不是System.Type实例,编译器肯定不认
  • System.Type.GetType(ClassA):首先你拼错了System(写成Systme了),其次GetType需要传入类型的全名字符串,而且这种魔法字符串很容易写错,还没有编译时检查,维护起来麻烦
  • ClassA.GetType():GetType()是实例方法,必须调用在对象实例上,ClassA是类型本身,不是实例,所以报错

正确且优雅的实现方式

直接用typeof(类型名)就能获取对应的System.Type对象,代码示例:

public class ClassA { }
public class ClassB { }
public class ClassC { }

// 这就是最优写法!
List<System.Type> allowedTypes = new List<System.Type>
{
    typeof(ClassA),
    typeof(ClassC)
};

这个方法的优势

  • 无需实例化对象:不管你的类有没有无参构造函数,或者实例化需要消耗资源,都能直接获取类型,完全不需要专门适配
  • 无魔法字符串:编译器会帮你检查类型名称是否正确,写错了直接编译报错,避免运行时才发现问题;如果后续重构类名/命名空间,IDE的重构工具会自动更新typeof里的内容,维护性拉满
  • 代码简洁直观:一眼就能看懂要添加哪些类型,可读性极强

对比你之前的可行方案

  • 实例化new ClassA().GetType():如果类的构造函数有参数、或者实例化成本高,这种方法就失效了,typeof完全没有这个限制
  • 魔法字符串GetType("ClassA"):不仅容易拼写错误,还需要传入完整的命名空间+类名(比如"YourNamespace.ClassA"),否则可能返回null,而typeof不需要考虑命名空间(只要当前上下文能访问到该类型)

内容的提问来源于stack exchange,提问作者user4385532

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 09:07:37