Исходное сообщение было опубликовано на GCDN. Поскольку GCDN внес изменения в интеграцию и теперь сосредоточен на обмене продуктами и по другим причинам, блог GCDN был закрыт, поэтому мне пришлось переместить сюда некоторые полезные сообщения.
13 августа 2009 г., 12:29 подмигнул
При написании этого блога CyljXu задал мне сегодня вопрос: как вызвать метод с параметрами ref или out посредством отражения? Полагая, что другие могут столкнуться с этой проблемой, я хотел бы записать ее, чтобы будущие читатели могли ее найти.
Это объясняется в MSDN, см. метод MethodBase.Invoke.
public Object Invoke (параметры Object obj, Object[])
Визуальный С++
общественный
: виртуальный Object^ Invoke( Object^ obj, arrayJ#
общественный
окончательный вызов объекта (параметры Object obj, Object[])
JScript
общественный
финальный
функция
Invoke(obj: Объект, параметры: Объект[]): Объект
параметр
Тип объекта: System.Object
Объект, для которого вызываются методы или конструкторы. Если метод статический, этот параметр игнорируется. Если конструктор является статическим, этот параметр должен быть пустой ссылкой (Nothing в Visual Basic) или экземпляром класса, в котором определен конструктор.
тип параметра: System.Object[]
Список параметров вызываемого метода или конструктора. Это массив объектов, которые имеют тот же номер, порядок и тип, что и параметры вызываемого метода или конструктора. Если параметров нет, параметры должны представлять собой нулевую ссылку (в Visual Basic ничего).
Если метод или конструктор, представленный этим экземпляром, принимает параметр ref (ByRef в Visual Basic), этот параметр не требует каких-либо специальных атрибутов, когда эта функция используется для вызова метода или конструктора. Если объект в массиве не инициализирован явно значением, объект будет содержать значение по умолчанию для этого типа объекта. Для элементов ссылочного типа значение равно нулю. Ссылка (Ничего в Visual Basic). Для элементов типа значения значение равно 0, 0,0 или false, в зависимости от конкретного типа элемента.
Итак, как вызвать и обработать переданное значение? Пожалуйста, посмотрите следующий пример:
1 class Program 2 { 3 static void Main(string[] args) 4 { 5 string content = "main" //#1 переменная 6 MethodInfo testMethod = typeof(Program).GetMethod("TestMethod", 7 BindingFlags.Static | BindingFlags.NonPublic); 8 if (testMethod != null) 9 {10 // Следующий способ не может вернуть содержимое.11 // --------------------- ----------------12 testMethod.Invoke(null, new object[] { content /* #1 переменная */ });13 Console.WriteLine(content); // # 1 переменная, вывод: main14 // ----------------------------------------- ----15 16 17 object [] ignoreArgs = new object[] { content /* #1 переменная */ };18 testMethod.Invoke(null, ignoreArgs);19 content = (string)invokeArgs[0]; // Переменная №2, обход вызова, присвоено значение content.20 Console.WriteLine(content); // Переменная №2, вывод: test21 }22 }23 24 static void TestMethod(ref string arg)25 {26 arg = "test "; // переменная №2, хотим перейти к основному процессу.27 }28 }
Быть апострофом, который превратил «Невозможно» в «Я возможен».
-------------------------------------------------- --
Блог Winkingzhang ( http://winkingzhang.cnblogs.com )
GCDN( http://gcdn.grapecity.com/cs )
-