#c# #generics #inheritance #nameof
#c# #общие сведения #наследование #nameof
Вопрос:
У меня есть иерархия наследования, подобная следующей:
public abstract class A
{
public string MyProperty {get; set;}
}
public class B : A
{
}
public class C : A
{
}
Затем у меня есть метод, который использует generics:
public void MyMethod<T>() where T : A
{
var str = nameof(T.MyProperty); // this one fails
}
Я пытаюсь получить имя MyProperty
, но это не удается, потому что я пытаюсь сделать это через тип вместо объекта. Есть ли умный способ получить имя свойства без необходимости передавать объект?
Ответ №1:
nameof(A.MyProperty)
.
Вы в любом случае должны T
быть A
.
Комментарии:
1. Потрясающе. Не уверен, почему я об этом не подумал.
Ответ №2:
Другим вариантом может быть создание «фиктивного» экземпляра T
:
public void MyMethod<T>() where T : A
{
var t = default(T);
var str = nameof(t.MyProperty);
}
Похоже, что компилятор достаточно умен, чтобы удалить этот фиктивный экземпляр в конфигурации выпуска.