我想使用Type.GetType(nameOfTheType)创建一个类型,其中nameOfTheType是一些字符串.如果nameOfTheType是"System.String",这很好用.如果nameOfTheType是"string",则抛出异常.包含关键字快捷键的所有类型都会失败.
有没有办法,除了一个大的switch语句,正确地将所有类型的关键字快捷方式映射到他们的实际类型名称(根据此列表:http://msdn.microsoft.com/en-us/library/ya5y69ds %28VS.80%29.aspx)?
编辑:Gabriel已正确指出我链接的MSDN页面不包含可空类型(int?等),但重要的是可以正确映射可空类型.
免责声明首先
让我说,我将在此处演示的方法纯粹是出于教育目的。请使用生产代码中其他答案中展示的开关或字典查找。
答
因此,要找出编译器会如何解释给定的代码块是实际编译它,并检查生成的程序集的唯一途径。在.NET中执行此操作并不难...您可以在运行时使用C#编译器来编译任意字符串,如下所示:
private static Type GetTypeByFullNameOrAlias(string typeName) { Type type = Type.GetType(typeName); if (type == null) { using (var provider = new CSharpCodeProvider()) { var compiler = provider.CompileAssemblyFromSource( new CompilerParameters {GenerateInMemory = true, GenerateExecutable = false, IncludeDebugInformation = false}, "public class A { public " + typeName + " B; }"); type = ((FieldInfo)compiler.CompiledAssembly.GetType("A").GetMember("B")[0]).FieldType; } } return type; }
但是,此技术有几个缺点...首先,它很慢。当然,您可以缓存结果并进行其他操作以加快处理速度。但是还有另一个问题,就是每次到达“ if”语句的内部时都会编译并加载一个完整的程序集。加载的每个程序集都无法再次卸载,并且会在应用程序关闭之前一直挂着,因此该技术还会泄漏少量的内存。同样,您可以将生成的程序集加载到单独的AppDomain中,并在检查类型之后将其卸载到域中,但这只会使代码慢很多。
但是正如我一开始所恳求的那样,只需在生产代码中使用“ switch”解决方案即可。它在翻译别名方面做得非常好。并不是说他们很快就会更改这些语言别名。