Type t = typeof(bool);
string typeName = t.Name;
В этом простом примере typeName
будет иметь значение "Boolean"
. Я хотел бы узнать, может ли/как я могу сказать это "bool"
.
То же самое для int/Int32, double/Double, string/String.
Type t = typeof(bool);
string typeName = t.Name;
В этом простом примере typeName
будет иметь значение "Boolean"
. Я хотел бы узнать, может ли/как я могу сказать это "bool"
.
То же самое для int/Int32, double/Double, string/String.
using CodeDom;
using Microsoft.CSharp;
// ...
Type t = typeof(bool);
string typeName;
using (var provider = new CSharpCodeProvider())
{
var typeRef = new CodeTypeReference(t);
typeName = provider.GetTypeOutput(typeRef);
}
Console.WriteLine(typeName); // bool
"Дружественные имена", как вы их называете, зависят от языка и не привязаны к структуре. Поэтому нет смысла иметь эту информацию в рамках, а в руководящих принципах проектирования MS требуется использовать имена фреймов для имен методов и т.д. (Например, ToInt32
и т.д.).
Из того, что я понимаю, bool
, string
, int
и т.д. - это просто псевдонимы для разработчиков С#.
После того, как компилятор обработает файл, их больше нет.
вы не можете. Все это ключевые слова С#. Но вы можете легко их сопоставить:
switch (Type.GetTypeCode(t)) {
case TypeCode.Byte: return "byte";
case TypeCode.String: return "string";
}
и т.д.
Сама инфраструктура .net не знает о ключевых словах С#. Но поскольку их всего около дюжины, вы можете просто вручную создать таблицу, содержащую имена, которые вы хотите.
Это может быть Dictionary<Type,string>
:
private static Dictionary<Type,string> friendlyNames=new Dictionary<Type,string>();
static MyClass()//static constructor
{
friendlyNames.Add(typeof(bool),"bool");
...
}
public static string GetFriendlyName(Type t)
{
string name;
if( friendlyNames.TryGet(t,out name))
return name;
else return t.Name;
}
Этот код не заменяет Nullable<T>
на T?
и не преобразует generics в форму, которую использует С#.
Я бы сказал, что вы не можете, так как эти имена специфичны для С# и, как таковые, не приведут к такому же результату, если разработчик захочет использовать VB.NET.
Вы получаете тип CLR, и это действительно то, что вы хотели бы иметь возможность воссоздать тип позже. Но вы всегда можете написать картографию имени.
Вы всегда можете создать словарь для перевода имен С# на "дружественные", которые вы хотите:
Dictionary<System.Type, string> dict = new Dictionary<System.Type, string>();
dict[typeof(System.Boolean)] = "bool";
dict[typeof(System.string)] = "string";
// etc...