Как сделать универсальный MethodInvoke? - PullRequest
0 голосов
/ 17 сентября 2009

Контекст Я хочу сделать этот звонок через отражение

instanceOfEventPublisher.Publish<T>(T eventInst);

Когда я звоню

` private void GenCall (IEventPublisher eventPublisher, объект theEventObj) {

        var thePublisher = eventPublisher.GetType();
        thePublisher.InvokeMember(
            "Publish",
            BindingFlags.Default | BindingFlags.InvokeMethod,
            null,
            eventPublisher,
            new object[] {theEventObj}
            );
    }

`

Я получаю: System.MissingMethodException: метод 'EventAggregator.EventPublisher.Publish' не найден.

Как назвать дженерик?

Ответы [ 3 ]

5 голосов
/ 17 сентября 2009

Вам необходимо использовать метод MakeGenericType, например:

var realizedType = thePublisher.MakeGenericType(eventObj.GetType());

Затем вы можете вызвать метод Publish, как он у вас есть в реализованном типе. Это верно, если вы имеете дело с универсальным типом; тем не менее, ваш код не выглядит так, как есть. Интерфейс, который вы используете для eventPublisher, не является универсальным интерфейсом.

Можете ли вы опубликовать оставшуюся часть кода, чтобы мы могли видеть определение интерфейса и определения общих классов.

Редактировать

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

  public class Publisher<T>
    {
        public void Publish(T args)
        {
            Console.WriteLine("Hello");
        }
    }
    static void Main(string[] args)
    {

        var type = typeof(Publisher<>);

        Publisher<EventArgs> publisher = new Publisher<EventArgs>();

        var realizedType = type.MakeGenericType(typeof(EventArgs));
        realizedType.InvokeMember("Publish", BindingFlags.Default | BindingFlags.InvokeMethod,
        null,
        publisher
        ,
        new object[] { new EventArgs() });

    }
3 голосов
/ 17 сентября 2009

Возможно, вам придется выполнить GetMethods() и выполнить поиск «Опубликовать» MethodInfo. Или, если «Опубликовать» не перегружен, вы можете просто набрать GetMethod("Publish"). В любом случае вам нужно будет вызвать MakeGenericMethod() на MethodInfo, чтобы добавить аргументы типа.

MethodInfo constructedPublish = thePublisher.GetMethod("Publish")
    .MakeGenericMethod( theEventObject.GetType() );
constructedPublish.Invoke( eventPublisher, new object[] { theEventObject } );
0 голосов
/ 17 сентября 2009

Возможно, вы используете обратную нотацию:

Publish`1[[assemblyQualifiedNameOfTypeOfClassl]]

(Просто предположение; не проверено).

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