如何通过字面量实例化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
相关产品推荐
相关产品推荐

