我想获得一个指定(原始)类型的C# 友好名称System.Type
的给定 a ,基本上是 C# 编译器在读取 C# 源代码时所做的方式。string
我觉得描述我所追求的最好方式是单元测试的形式。
我希望存在一种通用技术,可以使以下所有断言都通过,而不是尝试对特殊 C# 名称的特殊情况进行硬编码。
Type GetFriendlyType(string typeName){ ...??... }
void Test(){
// using fluent assertions
GetFriendlyType( "bool" ).Should().Be( typeof(bool) );
GetFriendlyType( "int" ).Should().Be( typeof(int) );
// ok, technically not a primitive type... (rolls eyes)
GetFriendlyType( "string" ).Should().Be( typeof(string) );
// fine, I give up!
// I want all C# type-aliases to work, not just for primitives
GetFriendlyType( "void" ).Should().Be( typeof(void) );
GetFriendlyType( "decimal" ).Should().Be( typeof(decimal) );
//Bonus points: get type of fully-specified CLR types
GetFriendlyName( "System.Activator" ).Should().Be(typeof(System.Activator));
//Hi, Eric Lippert!
// Not Eric? https://stackoverflow.com/a/4369889/11545
GetFriendlyName( "int[]" ).Should().Be( typeof(int[]) );
GetFriendlyName( "int[,]" ).Should().Be( typeof(int[,]) );
//beating a dead horse
GetFriendlyName( "int[,][,][][,][][]" ).Should().Be( typeof(int[,][,][][,][][]) );
}
到目前为止我尝试了什么:
这个问题是我的一个旧问题的补充,询问如何从类型中获取“友好名称”。
这个问题的答案是:使用CSharpCodeProvider
using (var provider = new CSharpCodeProvider())
{
var typeRef = new CodeTypeReference(typeof(int));
string friendlyName = provider.GetTypeOutput(typeRef);
}
我无法弄清楚如何(或如果可能的话)以相反的方式进行操作并从中获取实际的 C# 类型CodeTypeReference
(它也有一个接受 a 的 ctor string
)
var typeRef = new CodeTypeReference(typeof(int));