Как выполнить частный статический метод с дополнительными параметрами через отражение? - PullRequest
10 голосов
/ 20 октября 2011

У меня есть класс с закрытым статическим методом с необязательным параметром.Как мне вызвать его из другого класса через Reflection?Есть похожий вопрос , но он не касается статического метода или необязательных параметров.

public class Foo {
    private static void Bar(string key = "") {
       // do stuff
    }
}

Как вызвать Foo.Bar("test") и Foo.Bar() (например, без передачи необязательного параметра)

Ответы [ 2 ]

23 голосов
/ 20 октября 2011

Необязательные значения параметров в C # компилируются путем введения этих значений в место вызова. То есть хотя ваш код

Foo.Bar()

Компилятор фактически генерирует вызов как

Foo.Bar("")

При поиске метода вам нужно рассматривать необязательные параметры как обычные параметры.

var method = typeof(Foo).GetMethod("Bar", BindingFlags.Static | BindingFlags.NonPublic);

Если вы точно знаете, с какими значениями вы хотите вызвать метод, вы можете сделать:

method.Invoke(obj: null, parameters: new object[] { "Test" });

Если у вас есть только некоторые параметры и вы хотите использовать значения по умолчанию, вы должны проверить объекты ParameterInfo метода, чтобы определить, являются ли параметры необязательными и каковы эти значения. Например, чтобы распечатать значения этих параметров по умолчанию, вы можете использовать следующий код:

foreach (ParameterInfo pi in method.GetParameters())
{
    if (pi.IsOptional)
    {
        Console.WriteLine(pi.Name + ": " + pi.DefaultValue);
    }
}
2 голосов
/ 20 октября 2011

Использование этого класса

  public class Foo
  {
    private static void Bar(string key = "undefined key", string value = "undefined value")
    {
      Console.WriteLine(string.Format("The key is '{0}'", key));
      Console.WriteLine(string.Format("The value is '{0}'", value));
    }
  }

Вы можете использовать следующий код для вызова его со значениями по умолчанию

  MethodInfo mi = typeof(Foo).GetMethod("Bar", BindingFlags.NonPublic | BindingFlags.Static);
  ParameterInfo[] pis = mi.GetParameters();

  object[] parameters = new object[pis.Length];

  for (int i = 0; i < pis.Length; i++)
  {
    if (pis[i].IsOptional)
    {
      parameters[i] = pis[i].DefaultValue;
    }
  }

  mi.Invoke(null, parameters);

Если у метода были некоторые необязательные параметры, вам придется вставить их в массив параметров перед вызовом метода.

1009 * например *

private static void Bar(int number, string key = "undefined key", string value = "undefined")

Требуется ли вам сделать

parameters[0] = "23"

Перед вызовом

...