Как получить Type.Name, который включает в себя общие параметры? - PullRequest
0 голосов
/ 08 мая 2011

new List<int>().GetType().Name - Список`1. Как получить имя, похожее на List<int> (, а не List<T>)?

Ответы [ 2 ]

2 голосов
/ 08 мая 2011

Одним из способов было бы использование new List<int>().GetType().ToString(), которое возвращает System.Collections.Generic.List`1[System.Int32].

. Или вы можете написать себе небольшой вспомогательный метод в виде строк:

string GetShortName(Type type)
{
    string result = type.Name;
    if (type.IsGenericType)
    {
        // remove genric indication (e.g. `1)
        result = result.Substring(0, result.LastIndexOf('`'));

        result = string.Format(
            "{0}<{1}>",
            result,
            string.Join(", ",
                        type.GetGenericArguments().Select(t => GetShortName(t))));
    }

    return result;
}

, который выводит строкинапример:

List<Int32>
List<T>
Dictionary<List<Double>, Int32>
Tuple<T1, T2, T3, T4>

Обратите внимание, что для вложенных типов будет возвращено только самое внутреннее имя.

0 голосов
/ 08 мая 2011
String.Format("{0}<{1}>",GetType().Name, typeof(T).Name) 

Редактировать: как указано в комментарии, это полезно внутри обобщенного класса, например чтобы различать отдельные аргументы универсального типа для перегрузок, скажем, ToString (). В большинстве случаев нет смысла запрашивать первый аргумент {0}, указанный выше, поскольку он не изменяется в том же классе. Так что можно с таким же успехом использовать:

String.Format("List<{0}>", typeof(T).Name) 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...