Как передать параметры по ref при вызове статического метода с использованием отражения? - PullRequest
12 голосов
/ 24 апреля 2009

Я вызываю статический метод для объекта, используя отражение:

MyType.GetMethod("MyMethod", BindingFlags.Static).Invoke(null, new object[] { Parameter1, Parameter2 });

Как передать параметры по ссылке, а не по значению? Я предполагаю, что они будут по умолчанию. Первый параметр («Параметр1» в массиве) должен быть по ссылке, но я не могу понять, как передать его таким образом.

Ответы [ 2 ]

16 голосов
/ 24 апреля 2009

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

public class Example {
  public static void Foo(ref string name) {
    name = "foo";
  }
  public static void Test() {
    var p = new object[1];
    var info = typeof(Example).GetMethod("Foo");
    info.Invoke(null, p);
    var returned = (string)(p[0]);  // will be "foo"
  }
}
1 голос
/ 24 апреля 2009

Если вы позвоните Type.GetMethod и используете BindingFlag, равный BindingFlags.Static, ваш метод не будет найден. Уберите флаг или добавьте BindingFlags.Public, и он найдет статический метод.

public Test { public static void TestMethod(int num, ref string str) { } }

typeof(Test).GetMethod("TestMethod"); // works
typeof(Test).GetMethod("TestMethod", BindingFlags.Static); // doesn't work
typeof(Test).GetMethod("TestMethod", BindingFlags.Static
                                     | BindingFlags.Public); // works
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...