Преобразовать имя типа «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));

Ответы на вопрос(5)

Ваш ответ на вопрос