Это старый вопрос, но я тоже столкнулся с этим. Мне нравится ответ @ Igoy, но он не работает, если тип представляет собой массив типа NULL. Это мой метод расширения для обработки любой комбинации значений NULL / generic и array. Надеюсь, это будет полезно кому-то с тем же вопросом.
public static string GetDisplayName(this Type t)
{
if(t.IsGenericType && t.GetGenericTypeDefinition() == typeof(Nullable<>))
return string.Format("{0}?", GetDisplayName(t.GetGenericArguments()[0]));
if(t.IsGenericType)
return string.Format("{0}<{1}>",
t.Name.Remove(t.Name.IndexOf('`')),
string.Join(",",t.GetGenericArguments().Select(at => at.GetDisplayName())));
if(t.IsArray)
return string.Format("{0}[{1}]",
GetDisplayName(t.GetElementType()),
new string(',', t.GetArrayRank()-1));
return t.Name;
}
Это будет обрабатывать такие сложные задачи, как это:
typeof(Dictionary<int[,,],bool?[][]>).GetDisplayName()
Возвраты:
Dictionary<Int32[,,],Boolean?[][]>