Konvertieren Sie den Namen "C # friendly type" in den tatsächlichen Typ: "int" => typeof (int)

Ich möchte eine bekommenSystem.Type angenommenstring das gibt einen (primitiven) Typ anC # -freundlicher NameDies ist im Grunde die Vorgehensweise des C # -Compilers beim Lesen von C # -Quellcode.

Ich denke, die beste Art zu beschreiben, wonach ich strebe, ist ein Unit-Test.

Ich hoffe, dass es eine allgemeine Technik gibt, mit der alle unten aufgeführten Behauptungen bestanden werden können, anstatt zu versuchen, Sonderfälle für spezielle C # -Namen hart zu codieren.

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[,][,][][,][][]) ); 
}

Was ich bisher versucht habe:

Diese Frage ist die Ergänzung voneine ältere Frage von mir Fragen, wie man den "Anzeigenamen" von einem Typ erhält.

Die Antwort auf diese Frage lautet: useCSharpCodeProvider

using (var provider = new CSharpCodeProvider())
{
    var typeRef = new CodeTypeReference(typeof(int));
    string friendlyName = provider.GetTypeOutput(typeRef);
}

Ich kann nicht herausfinden, wie (oder wenn möglich) ich es andersherum machen und den tatsächlichen C # -Typ aus derCodeTypeReference (es hat auch einen ctor, der a brauchtstring)

var typeRef = new CodeTypeReference(typeof(int));

Antworten auf die Frage(5)

Ihre Antwort auf die Frage