Преобразовать имя типа «C # friendly» в фактический тип: «int» => typeof (int)
Я хочу получитьSystem.Type
учитываяstring
который определяет (примитивный) типC # понятное имяв основном так, как это делает компилятор C # при чтении исходного кода C #.
Я чувствую, что лучший способ описать то, что мне нужно, - это юнит-тест.
Я надеюсь, что существует общая методика, которая может выполнить все нижеприведенные утверждения, вместо того, чтобы пытаться жестко кодировать особые случаи для специальных имен 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
(он также имеет ctor, который принимаетstring
)
var typeRef = new CodeTypeReference(typeof(int));