2013-04-10 5 views
8

Я написал метод расширения GenericExtension. Теперь я хочу вызвать метод расширения Extension. Но значение methodInfo всегда равно нулю.Как назвать общий метод расширения с отражением?

public static class MyClass 
{ 
    public static void GenericExtension<T>(this Form a, string b) where T : Form 
    { 
     // code... 
    } 

    public static void Extension(this Form a, string b, Type c) 
    { 
     MethodInfo methodInfo = typeof(Form).GetMethod("GenericExtension", new[] { typeof(string) }); 
     MethodInfo methodInfoGeneric = methodInfo.MakeGenericMethod(new[] { c }); 
     methodInfoGeneric.Invoke(a, new object[] { a, b }); 
    } 

    private static void Main(string[] args) 
    { 
     new Form().Extension("", typeof (int)); 
    } 
} 

Что-то не так?

+0

См http://stackoverflow.com/questions/5959219/how -to-use-reflection-to-get-extension-method-on-generic-type? rq = 1 для получения дополнительной информации об этом. – skarmats

ответ

15

Метод расширения не привязан к типу Form, к которому она прикреплена к типу MyClass, так что берите его этого типа:

MethodInfo methodInfo = typeof(MyClass).GetMethod("GenericExtension", 
    new[] { typeof(Form), typeof(string) }); 
+1

Теперь я в депрессии ... Решение настолько просто и очевидно Спасибо – David

+0

@ Давид, не беспокойтесь, вы просто запутались, потому что это ** похоже на ** метод расширения прикреплен к типу 'Form'. Вам просто нужен второй набор глаз. –

-2

Вы передаете в строке в качестве родового параметра для вашего метода ..

Но ваши ограничения говорят, что T должен наследоваться от формы (что строка не делает).

Я предполагаю, что вы хотели написать typeof(MyForm) или некоторые из них там.

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