Подтвердить что ты не робот

С# - Получить удобное имя простых типов через отражение?

Type t = typeof(bool);
string typeName = t.Name;

В этом простом примере typeName будет иметь значение "Boolean". Я хотел бы узнать, может ли/как я могу сказать это "bool".

То же самое для int/Int32, double/Double, string/String.

4b9b3361

Ответ 1

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

Ответ 2

"Дружественные имена", как вы их называете, зависят от языка и не привязаны к структуре. Поэтому нет смысла иметь эту информацию в рамках, а в руководящих принципах проектирования MS требуется использовать имена фреймов для имен методов и т.д. (Например, ToInt32 и т.д.).

Ответ 3

Из того, что я понимаю, bool, string, int и т.д. - это просто псевдонимы для разработчиков С#.

После того, как компилятор обработает файл, их больше нет.

Ответ 4

вы не можете. Все это ключевые слова С#. Но вы можете легко их сопоставить:

switch (Type.GetTypeCode(t)) {
  case TypeCode.Byte: return "byte";
  case TypeCode.String: return "string";
}

и т.д.

Ответ 5

Сама инфраструктура .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 в форму, которую использует С#.

Ответ 6

Я бы сказал, что вы не можете, так как эти имена специфичны для С# и, как таковые, не приведут к такому же результату, если разработчик захочет использовать VB.NET.

Вы получаете тип CLR, и это действительно то, что вы хотели бы иметь возможность воссоздать тип позже. Но вы всегда можете написать картографию имени.

Ответ 7

Вы всегда можете создать словарь для перевода имен С# на "дружественные", которые вы хотите:

Dictionary<System.Type, string> dict = new Dictionary<System.Type, string>();
dict[typeof(System.Boolean)] = "bool";
dict[typeof(System.string)]  = "string";
// etc...