当前位置:  开发笔记 > 编程语言 > 正文

从C#关键字获取正确类型名称的最佳方法是什么?

如何解决《从C#关键字获取正确类型名称的最佳方法是什么?》经验,为你挑选了1个好方法。

我想使用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?等),但重要的是可以正确映射可空类型.



1> JohannesH..:

免责声明首先
让我说,我将在此处演示的方法纯粹是出于教育目的。请使用生产代码中其他答案中展示的开关或字典查找。


因此,要找出编译器会如何解释给定的代码块是实际编译它,并检查生成的程序集的唯一途径。在.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”解决方案即可。它在翻译别名方面做得非常好。并不是说他们很快就会更改这些语言别名。

推荐阅读
Gbom2402851125
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有