【发布时间】: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#