Учитывая экземпляр типа, как получить общее имя типа в C #?

В этом случае, я думаю (по крайней мере, по большей части), вы правы, и это неправильно. Стандарт описывает logic_error как:

Класс logic_error определяет тип объектов, которые были выбраны как исключения для сообщения ошибок, предположительно обнаруживаемых до выполнения программы, таких как нарушения логических предпосылок или инвариантов классов.

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

В отличие от этого, он описывает runtime_error как:

Класс runtime_error определяет тип объектов, которые были выбраны как исключения для отчетов об ошибках, предположительно обнаруживаемых только тогда, когда программа выполняется.

Кажется, что это лучше подходит.

30
задан George Polevoy 15 March 2010 в 16:38
поделиться

1 ответ

Я вижу, вы уже приняли ответ, но, честно говоря, этого ответа будет недостаточно, чтобы сделать это надежно, если вы просто объедините то, что там, с то, что вы уже написали. Это на правильном пути, но ваш код будет работать только для универсальных типов с одним универсальным параметром, и он будет работать только в том случае, если сам параметр универсального типа не является универсальным!

Это функция (написанная как метод расширения), которая действительно должна работать во всех случаях:

public static class TypeExtensions
{
    public static string ToGenericTypeString(this Type t)
    {
        if (!t.IsGenericType)
            return t.Name;
        string genericTypeName = t.GetGenericTypeDefinition().Name;
        genericTypeName = genericTypeName.Substring(0,
            genericTypeName.IndexOf('`'));
        string genericArgs = string.Join(",",
            t.GetGenericArguments()
                .Select(ta => ToGenericTypeString(ta)).ToArray());
        return genericTypeName + "<" + genericArgs + ">";
    }
}

Эта функция является рекурсивной и безопасной. Если вы запустите его на этом входе:

Console.WriteLine(
    typeof(Dictionary<string, List<Func<string, bool>>>)
    .ToGenericTypeString());

Вы получите этот (правильный) результат:

Dictionary<String,List<Func<String,Boolean>>>
60
ответ дан 27 November 2019 в 23:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: