C# nameof универсальный тип без указания типа

Предположим, у меня есть типа

public class A<T> { }

и где-то в коде я хочу выбросить исключение, связанное с неправильным использованием этого типа:

throw new InvalidOperationException("Cannot use A<T> like that.");

пока все хорошо, но я не хочу жестко кодировать имя классов, поэтому я подумал, что могу использовать

throw new InvalidOperationException($"Cannot use {nameof(A<T>)} like that.");

вместо этого, но в этом контексте я не знаю точного типа T. Поэтому я подумал, что, возможно, я мог бы сделать это со специализацией шаблона, как в C++:

throw new InvalidOperationException($"Cannot use {nameof(A)} like that.");

или

throw new InvalidOperationException($"Cannot use {nameof(A<>)} like that.");

но тем доходность

неверное количество параметров типа.

и

аргумент типа отсутствует.


Я абсолютно не хочу hardcode имя классов для него может измениться позже. Как я могу получить имя класса, предпочтительно через nameof?

оптимально, чего я хочу достичь, это "Cannot use A<T> like that." или "Cannot use A like that.".

3 ответов


если вы не заботитесь об отображении T, вы можете просто использовать, например,nameof(A<object>), предполагая, что object соответствует ограничениям универсального типа.

это приводит к "не может использовать подобное."

если вы хотите напечатать именно A<T>, вы можете использовать:

$"{nameof(A<T>)}<{nameof(T)}>"

но только изнутри класса, как T не существует в другом месте.


в зависимости от места, где вы хотите создать это исключение, вы можете использовать тип.

на экземпляре, называют this.GetType() а потом Name или FullName свойства:

throw new InvalidOperationException($"Cannot use {this.GetType().Name} like that.");

вы пробовали:

typeof(T).FullName;

или

t.GetType().FullName;

надеюсь, что это работает для вас.