【问题标题】:How can I get a type(type object) with its friendly name(string)? [duplicate]如何获得具有友好名称(字符串)的类型(类型对象)? [复制]
【发布时间】:2021-08-30 08:35:15
【问题描述】:

比如我想有一个方法从"int"得到typeof(int),从"List<int>"得到typeof(List<int>),从"Dictionary<string,int>"得到typeof(Dictionary<string, int>)等等。

如果友好名称在调用上下文中不明确,则可以抛出异常或简单地返回 null。

我可以使用字典来存储所有内置友好类型的映射,但是手动映射每个具体的泛型类型太复杂了。我找不到一种方法来建立我可能需要的所有友好名称。

在某些脚本语言中,C# 中是否有一些“eval”方法? IE。所以我可以简单地以友好名称作为输入运行typeof 并获取Type 对象引用作为返回值?

【问题讨论】:

  • 我很确定您可以使用 CSharpCodeDomProvider(或相关)来执行此操作。 Roslyn API 也是如此
  • 也许您正在寻找Type.GetType 例如。 docs.microsoft.com/en-us/dotnet/api/… - 结合避免命名空间,例如。 stackoverflow.com/questions/9273629/… - 而不是Type.GetType("System.Int32"); 可以给你Type.GetTypeWithoutNamespace("Int32");
  • 我不认为关于避免命名空间的帖子适用于泛型类型。我相信程序集的 GetTypes 方法不会返回泛型类型的具体版本,这意味着我必须使用我想要支持的每个泛型参数手动创建具体类型。如果我弄错了,请告诉我。
  • typeof 关键字仅在编译时有效。要在运行时动态获取Type 对象,您需要反射。有关非通用和通用方案的解决方案,请参阅副本。

标签: c#


【解决方案1】:

您可以使用 .GetType().Name 简单地获取对象的类型。

T.GetType().Name // class name, no namespace
T.GetType().FullName // namespace and class name
T.GetType().Namespace // namespace, no class name

【讨论】:

  • GetType 需要一个类型的完全限定名称,它不能从用户输入中获得,而且手动建立一个有点复杂。
  • 也可以使用 typeof(T) 作为示例 => typeof(T).Name // 类名,没有命名空间 typeof(T).FullName // 命名空间和类名 typeof(T) .Namespace // 命名空间,没有类名
  • 在我看来你误解了这个问题。您的所有三个示例语句都假定您已经拥有可以从中获取Type 对象的东西。问题是问首先如何获得Type 对象
猜你喜欢
  • 1970-01-01
  • 2012-12-17
  • 2013-05-04
  • 1970-01-01
  • 2017-06-29
  • 2010-09-24
  • 1970-01-01
相关资源
最近更新 更多