У меня есть ситуация, где я должен назвать метод интерфейса с помощью отражения, как это
object x = null;
MethodInfo method = interfaceExists.GetMethod("ShutDown");
method.Invoke(x, new object[] { 4 })
Поскольку Вы видите, что я не создаю объект-экземпляр! И, поскольку я могу предполагаемый, я получаю исключение
Нестатический метод требует цели
И Вопрос, я могу назвать метод интерфейса с помощью отражения, не создавая экземпляр интерфейса и если ДА, Как я могу сделать это?
Если вы абсолютно уверены, что метод интерфейса не повлияет на состояние объекта (а это вообще очень плохое предположение), вы можете создать экземпляр без вызова конструктора, вызвав FormatterServices.GetUnitializedObject . Лично я настоятельно рекомендую этого не делать, поскольку при вызове метода интерфейса неинициализированного типа может произойти множество неприятностей.
Интерфейс не имеет реализации, поэтому вы не можете вызвать его метод без экземпляра объекта, реализующего этот интерфейс.
Если это метод экземпляра, вам нужен экземпляр, с помощью которого можно вызвать метод. Отсюда «экземплярный» метод.
Методы экземпляра могут иметь зависимости от переменных экземпляра, о которых отражение не знает, поэтому он не может гарантировать, что метод экземпляра не изменяет состояние экземпляра того типа, в котором он определен.
Вот почему вы получите предупреждения FxCop о (перефразируя здесь) «Сделайте этот метод статическим, поскольку он не изменяет состояние класса».
Ваш нестатический метод интерфейса в конечном итоге должен будет вызвать метод, реализованный на объекте. Если реализация метода не существует, то реальный метод не может быть вызван.
Можно ли вызвать метод интерфейса без создания экземпляра? Нет. Интерфейсы предназначены для членов экземпляра; статические члены класса не имеют отношения к интерфейсам.
Вы можете получить желаемое, предоставив статическую реализацию интерфейса,
public class MyImplementation : IMyInterface
{
public static readonly Instance = new MyImplementation();
private MyImplementation() { }
}
// ...then your code might look like:
MethodInfo method = typeof(IMyInterface).GetMethod("ShutDown");
method.Invoke(MyImplementation.Instance, new object[] { 4 })
Или вы можете сделать метод расширения:
public static class MyExtensions
{
public static void ShutDown(this IMyInterface obj, ...) { ... }
}
// ...then your code might look like:
object x = null;
MethodInfo method = typeof(MyExtensions).GetMethod("ShutDown");
method.Invoke(x as IMyInterface, new object[] { 4 });
Если метод нестатический, вы должны создать экземпляр объекта, чтобы использовать его. Поскольку интерфейсы не могут иметь статических методов, вам необходимо создать экземпляр объекта с интерфейсом на нем для выполнения метода.