【问题标题】:Programmatically get list of all Built-in types以编程方式获取所有内置类型的列表
【发布时间】:2020-03-19 05:15:57
【问题描述】:

我从Built-in types table (C# Reference) 获得了所有内置类型。 有没有办法以编程方式获取此列表? 我不知道如何使用反射,所以我什至不知道如何开始。我还没有代码。

【问题讨论】:

  • 为什么不直接硬编码呢?它不会在运行时改变......
  • 只是好奇:你为什么需要它?类型是内置的还是框架的一部分通常与应用程序无关。
  • @PMF 正如我之前所说,我不知道如何使用反射。我只是好奇这是否可能。语句:_listElementType = GetListType(_list);字符串名称 = _listElementType.Name; _isSystemType = name.GetType().Namespace == "系统"; // 这将返回 System(包含该类型的命名空间)如果它是 System 类型(内置类型)会告诉我它是否是系统类型。
  • @user2102327:这是一个非常模糊的测试。系统命名空间中有一些类型通常不被认为是内置的(即所有异常类型,ConsoleEnvironment 类)。事实上,没有什么能阻止您自己在该命名空间中创建新类型(尽管这不是一个好主意)。
  • @PMF 你能推荐一个更好的方法吗?

标签: c# .net types built-in


【解决方案1】:

使用反射来获取这些类型并不是一个好主意。 仅用于学习目的您使用以下 sn-ps。

获取框架原始类型全名:

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 别名。

【讨论】:

  • 非常感谢。我想知道您为什么说:“使用反射来获取这些类型不是一个好主意”。
  • 不客气。这是因为您可以轻松地定义一个包含这些类型的数组,与使用反射在程序集中的所有类型之间进行搜索相比,惩罚更少。
猜你喜欢
  • 2011-07-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多