以编程方式获取所有内置类型的列表

4

我从内置类型表(C#参考)中获取了所有内置类型。 有没有一种编程方法可以获取这个列表? 我不知道如何使用反射,因此甚至不知道如何开始。我还没有任何代码。


为什么不直接硬编码呢?这不是在运行时会发生变化的东西... - Sweeper
@PMF 正如我之前所说,我不知道如何使用反射。我只是好奇它是否可能。以下语句: _listElementType = GetListType(_list); string name = _listElementType.Name; _isSystemType = name.GetType().Namespace == "System"; // 如果它是系统类型(内置类型),则返回包含该类型的命名空间 System,将告诉我它是否为系统类型。 - user2102327
@user2102327:这是一个非常模糊的测试。在系统命名空间中有一些类型通常不被视为内置类型(即所有异常类型,ConsoleEnvironment类)。实际上,没有任何东西阻止您自己在该命名空间中创建新类型(尽管这不是一个好主意)。 - PMF
@PMF,你能提供更好的方法吗? - user2102327
typeof(Type).Assembly.GetTypes().Where(x => x.IsPrimitive) 将会给你一个所有原始类型的列表。StringObject 不是原始类型,但被认为是简单类型。 - Reza Aghaei
显示剩余3条评论
1个回答

8

使用反射获取那些类型并不是一个好主意。 仅供学习目的,您可以使用以下代码片段。

获取框架基本类型的完整名称:

var frameworkTypesFullName = typeof(Type).Assembly.GetTypes()
    .Where(x => x.IsPrimitive).Select(x => x.FullName).ToList();

获取基元类型的 C# 别名:

var cs = new CSharpCodeProvider(); //dispose later or put in using statement
var csharpTypesAlias = typeof(Type).Assembly.GetTypes()
    .Where(x => x.IsPrimitive).Select(x =>
        cs.GetTypeOutput(new CodeTypeReference(x))).ToList();

还有System.StringSystem.Object,它们不是原始数据类型,但通常被称为简单类型,在C#中有stringobject别名。


非常感谢。不过我想知道为什么你说:“使用反射获取这些类型不是一个好主意”。 - user2102327
1
不客气。这是因为你可以轻松地定义一个包含这些类型的数组,相比使用反射在程序集中搜索所有类型而言,惩罚更小。 - Reza Aghaei

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