Отражение.NET: Как назвать метод интерфейса, не создавая экземпляр?

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

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

Поскольку Вы видите, что я не создаю объект-экземпляр! И, поскольку я могу предполагаемый, я получаю исключение

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

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

8
задан John Saunders 7 May 2010 в 13:49
поделиться

6 ответов

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

13
ответ дан 5 December 2019 в 05:25
поделиться

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

1
ответ дан 5 December 2019 в 05:25
поделиться

Если это метод экземпляра, вам нужен экземпляр, с помощью которого можно вызвать метод. Отсюда «экземплярный» метод.

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

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

10
ответ дан 5 December 2019 в 05:25
поделиться

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

2
ответ дан 5 December 2019 в 05:25
поделиться

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

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

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
ответ дан 5 December 2019 в 05:25
поделиться

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

4
ответ дан 5 December 2019 в 05:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: