2011-12-14 2 views
0

У меня есть объект MethodInfo, который определяет метод, который я хочу вызвать.Как вызвать MethodInfo?

Кроме того, мне нужен object, из которого MethodInfo.

псевдо-код:

void CallMethod(MethodInfo m) 
{ 
    Object o = Activator.CreateInstance(m.ClassType); 
    o.GetType().InvokeMember(m.Name, BindingFlags.InvokeMethod, null, o, null); 
} 

За исключением я не знаю, как получить type класса, который MethodInfo принадлежит.

Как я могу позвонить MethodInfo?

ответ

2

Это создаст объект с вашего типа MethodInfo и вызовет его для вас на этом новом объекте.

void CallMethod(MethodInfo m) 
{ 
    Object o = Activator.CreateInstance(m.ReflectedType); 
    m.Invoke(o, null); 
} 
+0

Образец кода, который отвечает на мой вопрос, напрямую выигрывает. Но примечание Рида в ответе Джона важно: 'ReflectedType' над' DeclaringType' –

0

Вы можете определить тип, определяющий метод, путем обращения к свойству DeclaringType объекта MethodInfo.

5

The MethodInfo не знать цель вызова метод - MethodInfo эффективно принадлежит типа, а не один конкретный объект.

Для вызова метода необходимо иметь экземпляр целевого типа. Вы можете найти тип достаточно легко, используя MethodInfo.DeclaringType (унаследованный от MemberInfo.DeclaringType), но вы не можете иметь экземпляр в этой точке ...

Как отмечает Рид, MemberInfo.ReflectedType может быть более подходящим, чем DeclaringType, в зависимости от того, как вы планируя использовать его.

Вы ничего не объяснили о том, что делаете, но может быть более целесообразным принять делегата Action вместо MethodInfo, если остальная часть вашего проекта может быть изменена соответствующим образом.

+1

Возможно, вы захотите упомянуть, что вам не нужен экземпляр, если он статичен. – x0n

+0

Кроме того, стоит упомянуть, что свойство 'ReflectedType' * может быть более уместным, так как' DeclaringType' может быть абстрактным классом ... –

+0

@ReedCopsey: Righto, сделаем. –

0

Возможно, я не понимаю вопрос, но похоже, что вы после делегата, а не MethodInfo.

void Main() 
{ 
    Object myObject = new ArrayList(); 
    MethodInfo methodInfo = myObject.GetType().GetMethod("Clear"); 
    Delegate method = Delegate.CreateDelegate(typeof(Action), myObject, methodInfo, true); 
    CallMethod(method); 
} 

void CallMethod(Delegate method) 
{ 
    method.DynamicInvoke(); 
} 

Там явно более простой способ получить делегат в этом обстоятельстве (method = new Action(myObject.Clear)), но я собираюсь на ваш вопрос о необходимости использования объекта MethodInfo.

+0

'MethodInfo' происходит от' Type.GetMethods' (http://msdn.microsoft.com/en-us/library/td205ybf(v=VS .80) .aspx), который используется для поиска всех методов с определенным атрибутом. –

Смежные вопросы