Я хочу получить System.Type
с учетом string
, который задает дружественное имя типа (примитивного) типа С#, в основном, как это делает компилятор С# при чтении исходного кода на С#.
Я считаю, что лучший способ описать, что мне нужно, - это unit тест.
Моя надежда заключается в том, что существует общий метод, который может сделать все приведенные ниже утверждения, а не пытаться жестко программировать специальные случаи для специальных имен С#.
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[,][,][][,][][]) );
}
То, что я пробовал до сих пор:
Этот вопрос является дополнением к старому вопросу о моей проблеме, в котором спрашивается, как получить "дружественное имя" от типа.
Ответ на этот вопрос: use CSharpCodeProvider
using (var provider = new CSharpCodeProvider())
{
var typeRef = new CodeTypeReference(typeof(int));
string friendlyName = provider.GetTypeOutput(typeRef);
}
Я не могу понять, как (или, если возможно) сделать это наоборот и получить фактический тип С# из CodeTypeReference
(он также имеет ctor, который принимает string
)
var typeRef = new CodeTypeReference(typeof(int));