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.");