C # Generics: как использовать nameof для получения имени свойства базового класса

#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);
}
  

Похоже, что компилятор достаточно умен, чтобы удалить этот фиктивный экземпляр в конфигурации выпуска.