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));