如何将源代码片段解析为System.Type

时间:2017-02-02 16:13:06

标签: c# parsing types gettype

我有一组这样的字符串:

System.Int32
string
bool[]
List<MyType.MyNestedType>
Dictionary<MyType.MyEnum, List<object>>

我想测试这些字符串是否实际上是有效类型的源代码表示。

我在一个环境中,不支持Roslyn并且合并任何类型的解析器都很困难。这就是为什么我尝试使用System.Type.GetType(string)来解决这个问题。

但是,我走的是一条肮脏的道路,因为有很多边缘情况,我需要修改输入字符串来表示AssemblyQualifiedString。例如。嵌套类型“MyType.MyNestedType”需要是“MyType + MyNestedType”,并且必须通过艰难的方式找出泛型。

是否有任何辅助方法可以在.Net 2.0中进行此类检查?我在Unity游戏引擎中工作,我们没有办法将系统切换到可用解析器的更复杂的环境。

澄清 我的公司在Unity中开发了一个代码生成系统,此时不易改变。我需要添加的一件事是能够获取类中定义的字段列表(通过反射),然后根据它们是否是默认运行时程序集的一部分或者它们是否包含在#if中来分隔它们UNITY_EDITOR预处理程序指令。当这些设置完成后,我基本上想要以不同的方式处理这些字段,但仅凭反射无法告诉我。因此,我决定打开我的脚本文件,查看这些定义区域的文本,然后检查是否在其中声明了一个字段,如果为true,则将其放在单独的FieldInfo []数组中。

一件事是固定的而且不可更改的:所有脚本都将通过反射进行检查,FieldInfo的集合用于在其他地方生成新的源代码。我只需要将该集合分成单独的集合,用于运行时与编辑器程序集。

1 个答案:

答案 0 :(得分:1)

自定义类型和嵌套泛型可能是最难的部分。

你是否只能拥有一个&#34;等效地图来完全限定名称&#34;或所有自定义类型的一些翻译规则? 我猜你会提前知道你会遇到什么。

或者也许以相反的方式运行它:在启动时,扫描你的程序集和内部包含的每个类,生成等效名称&#34;因为它应该出现&#34;在您的输入文件中,来自GetType()格式的完全限定名称?

对于其他程序集的自定义类型,请注意,您必须先执行诸如调用Assembly.LoadFile()或将第二个参数中的程序集名称传递给GetType()才能加载它们。 例如:Resolve Type from Class Name in a Different Assembly

也许这个答案也有帮助:How to parse C# generic type names?

请您详细说明项目的最终目的是什么?问题有点令人惊讶,特别是对于团结项目。是因为你使用某种奇怪的序列化来保持某些对象的状态吗?

这个答案更多的是一些建议和问题,可以帮助你澄清需求,而不是一个确定的答案,但它不能在一个评论中保留,我认为它提供了有用的信息