2010-08-04 2 views
3

Мне нужно вызвать метод void с отражением, который имеет 2 нормальных параметра и третий параметр, который является ссылочным параметром. Я видел много сообщений о проблеме, и все предлагают использовать функцию GetMethod вместо InvokeMember. Я пробовал InvokeMember, и он работает, кто-то может объяснить мне почему?Вызвать метод со ссылочными параметрами с Reflection

Class1 myreferenceparam = new Class1(); 
myobject.InvokeMember("MyMethod", BindingFlags.InvokeMethod | BindingFlags.Default, null, myobject, new object[] { myparam1, myparam2, myreferenceparam }); 
Response.Write(myreferenceparam.myfield); 

Метод MyMethod редактирует поле myfield класса 1. Правильно ли мой код или я должен использовать GetMethod?

+0

Рассмотрите динамические. Если вы используете C# 4, вы можете назначить объект «динамическому» и вызвать метод, как если бы он был известен. Ex dynamic d = ваш-неизвестный-объект; d.MyMethod (параметры); –

ответ

0

GetMethod предоставит вам метаданные метода (MethodInfo), которые могут быть использованы для изучения метода и принятия соответствующих мер. Например, если метод не существует или не может быть найден, вы получите MethodInfo как null, и вы можете обработать его до вызова InvokeMemeber в методе.

InvokeMember, как следует из названия, просто вызовет метод, указанный в аргументах. Если метод не найден, он выкинет «MissingMethodException», поэтому вы потеряете бит проверки, предложенный GetMethod.

+0

, но поэтому InvokeMethod правильно вызывает метод, передающий параметр в качестве ссылки? Поскольку изменения, вызванные методом do, кажется, отражены в переменной, переданной по ссылке, даже если я не использую GetMethod – Stefano

+0

, ваш код в порядке, хотя вы могли бы использовать использованный альтернативный метод, получив методinfo, а затем вызвав Invoke для информации о методе , Кажется, интересная статья об этом на msdn, которая показывает эффективность этих альтернатив: http://msdn.microsoft.com/en-us/magazine/cc163759.aspx#S6 – akapoor

+0

Я вижу, что InvokeMember самый медленный, поэтому я должен использовать MemberInfo ... – Stefano

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