Отражение .NET: Как вызвать метод интерфейса без создания экземпляра? - PullRequest
8 голосов
/ 07 мая 2010

У меня есть ситуация, когда мне нужно вызвать метод интерфейса, используя отражение, как это

object x = null;
MethodInfo method = interfaceExists.GetMethod("ShutDown");
method.Invoke(x, new object[] { 4 })

Как видите, я не создаю экземпляр объекта! И, как я могу предположить, я получаю исключение

Нестатический метод требует цели

И Вопрос, Могу ли я вызвать метод интерфейса, используя отражение, не создавая экземпляр интерфейса, и если ДА, как я могу это сделать?

Ответы [ 6 ]

13 голосов
/ 07 мая 2010

Если вы абсолютно уверены, что метод интерфейса не повлияет на состояние объекта (и это обычно очень плохое предположение), вы можете создать экземпляр без вызова конструктора, вызвав FormatterServices.GetUnitializedObject . Лично я настоятельно рекомендую против этого, поскольку при вызове метода интерфейса для неинициализированного типа может произойти любое количество плохих вещей.

10 голосов
/ 07 мая 2010

Если это метод экземпляра, вам необходим экземпляр для вызова метода. Отсюда и «экземплярный» метод.

Методы экземпляра могут иметь зависимости от переменных экземпляра, о которых рефлексия не знает, поэтому он не может гарантировать, что метод экземпляра не изменит состояние экземпляра типа, в котором он определен.

Вот почему вы получите предупреждение FxCop о (перефразируя здесь) «Сделайте этот метод статичным, так как он не изменяет состояние класса».

4 голосов
/ 07 мая 2010

Если метод нестатический, вы должны создать экземпляр объекта, чтобы использовать его. Поскольку интерфейсы не могут иметь статические методы, вам нужно создать экземпляр объекта с интерфейсом для выполнения метода.

2 голосов
/ 07 мая 2010

Ваш нестатический интерфейсный метод в конечном итоге должен будет вызвать метод, который реализован на объекте. Если реализация метода не существует, то никакой реальный метод не может быть вызван.

1 голос
/ 07 мая 2010

Можете ли вы вызвать метод интерфейса, не создавая экземпляр? Нет. Интерфейсы являются, например, членами; статические члены класса не связаны с интерфейсами.

Вы можете получить то, что хотите, предоставив статическую реализацию интерфейса,

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 });
1 голос
/ 07 мая 2010

Интерфейс не имеет реализации, поэтому вы не можете вызвать его метод без экземпляра объекта, который реализует этот интерфейс.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...