C # - Получить понятное имя простых типов с помощью отражения? - PullRequest
18 голосов
/ 06 января 2011
Type t = typeof(bool);
string typeName = t.Name;

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

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

Ответы [ 7 ]

39 голосов
/ 06 января 2011
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
5 голосов
/ 06 января 2011

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

2 голосов
/ 06 января 2011

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

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

1 голос
/ 06 января 2011

.NET сама среда не знает о конкретных ключевых слов C #. Но поскольку их всего около десятка, вы можете просто вручную создать таблицу, содержащую нужные вам имена.

Это может быть 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? и не преобразует дженерики в форму, используемую в C #.

1 голос
/ 06 января 2011

ты не можешь.Это все ключевые слова, специфичные для C #.Но вы можете легко сопоставить их:

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

и т. Д.

0 голосов
/ 06 января 2011

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

Dictionary<System.Type, string> dict = new Dictionary<System.Type, string>();
dict[typeof(System.Boolean)] = "bool";
dict[typeof(System.string)]  = "string";
// etc...
0 голосов
/ 06 января 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...