gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 21:03:32 25 4
gpt4 key购买 nike

我想使用 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 中,并在检查完类型后卸载该域,但这只会使代码变慢很多。

但正如我一开始所恳求的那样,只需在您的生产代码中使用“切换”解决方案......它在翻译别名方面做得非常好。而且他们不会很快更改这些语言别名。

关于c# - 从 C# 关键字获取正确类型名称的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1664577/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com