#c# #reflection #inheritance #abstract-class
#c# #отражение #наследование #абстрактный класс
Вопрос:
У меня есть следующий класс в c #, должно быть легко выполнить
public abstract class BaseAbstract
{
public void PrintMethodNames()
{ // This line might needs change
foreach (PropertyInfo pi in typeof(BaseAbstract).GetProperties())
{
Console.WriteLine(pi.Name);
}
}
}
public class DerivedClass : BaseAbstract
{
public void MethodA() { }
public void MethodB() { }
public void MethodC() { }
}
public class MainClass
{
public static void Main()
{
BaseAbstract ba = new DerivedClass();
ba.PrintMethodNames();
// desired printout
// MethodA
// MethodB
// MethodC
// but obviously not working
}
}
Итак, что я ищу?
Ответ №1:
Здесь есть несколько проблем:
MethodA
,MethodB
иMethodC
являются методами, а не свойствами, поэтому вам нужно использоватьGetMethods
вместоGetProperties
.- Вы должны использовать текущий тип экземпляра (
GetType
) вместо типа базового класса (typeof(BaseAbstract)
). - Вам нужно ограничить отражение с помощью
BindingFlags
, чтобы получить только методы, определенные в производном классе. В противном случае, без этих флагов, вы получите все методы, определенные для данного типа (например,ToString
,GetHashCode
и дажеPrintMethodNames
).
Это выводит то, что вы ожидаете:
public abstract class BaseAbstract
{
public void PrintMethodNames()
{
BindingFlags flags =
BindingFlags.DeclaredOnly |
BindingFlags.Public |
BindingFlags.Instance |
BindingFlags.Static;
foreach (MethodInfo mi in GetType().GetMethods(flags))
{
Console.WriteLine(mi.Name);
}
}
}
Комментарии:
1. Дело в том, что он хочет перечислить все методы DerivedCalss из BaseClass (напротив). Базовый класс не знает, что это производный класс, и в этом проблема.
2. @HABJAN: код, который я предоставил, делает это. Если вы замените его
BaseAbstract
на мою версию выше и запустите программу, вы увидите, что она выводит желаемый результат (только методы, определенные вDerivedClass
).3. @HABJAN: Смотрите пункт № 2:
GetType
возвращает тип времени выполнения экземпляра, а не статический тип, в которомGetType
вызывается. Итак, в данном конкретном случаеGetType
возвращаетсяDerivedClass
.
Ответ №2:
Замените typeof(BaseAbstract).GetProperties()
на this.GetType().GetProperties()
.
Комментарии:
1. спасибо за быстрый ответ, но я собираюсь отдать должное Крису Шмичу за добавление кода BindingFlag