c # получить имена методов из базового типа, используя отражение - PullRequest
0 голосов
/ 03 января 2012

Я хотел бы перечислить все имена методов из базового типа.

Я пытался

var methods = this.GetType().UnderlyingSystemType.GetMethods();

, но не работает.

EDIT

Добавлен пример

public class BaseClass
{
   public BaseClass()
   {
         var methods = this.GetType().UnderlyingSystemType.GetMethods();
   }
}

public class Class1:BaseClass
{
   public void Method1()
   {}

   public void Method2()
   {}
}

Мне нужно в коллекцию Method1 и Method 2.

Ответы [ 4 ]

1 голос
/ 03 января 2012

Код, который вы указали, работает.

System.Exception test = new Exception();
var methods = test.GetType().UnderlyingSystemType.GetMethods();

foreach (var t in methods)
{
    Console.WriteLine(t.Name);
}

возвращает

get_Message
get_Data
GetBaseException
get_InnerException
get_TargetSite
get_StackTrace
get_HelpLink
set_HelpLink
get_Source
set_Source
ToString
GetObjectData
GetType
Equals
GetHashCode
GetType

РЕДАКТИРОВАТЬ:

Это то, что вы хотите?

Class1 class1 = new Class1();
var methodsClass1 = class1.GetType().GetMethods(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance);

BaseClass baseClass = new BaseClass();
var methodsBaseClass = baseClass.GetType().GetMethods(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance);

foreach (var t in methodsClass1.Where(z => methodsBaseClass.FirstOrDefault(y => y.Name == z.Name) == null))
{
    Console.WriteLine(t.Name);
}
1 голос
/ 03 января 2012

Попробуйте что-то вроде

MethodInfo[] methodInfos =
typeof(MyClass).GetMethods(BindingFlags.Public |
                                                      BindingFlags.Static);
0 голосов
/ 03 января 2012

Проблема заключается в переопределении GetType, которое вы вызываете в конструкторе BaseClass.

Если вы создадите экземпляр типа Class1 и посмотрите на имеющиеся у вас методы, вы увидите все6 методов.

Если вы создадите экземпляр типа BaseClass, вы увидите только 4 метода - 4 метода из типа Object.

Создавая экземпляр подкласса, вынеявно вызывают конструктор в BaseClass.Когда он использует GetType (), он использует переопределенный виртуальный метод типа Class1, который возвращает ожидаемый ответ.

0 голосов
/ 03 января 2012
here is an example on how to use reflection to get the Method names
replace MyObject with your Object / Class

using System.Reflection;
MyObject myObject;//The name of the Object
foreach(MethodInfo method in myObject.GetType().GetMethods())
 {
    Console.WriteLine(method.ToString());
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...