2009-09-17 2 views
0

Контекст Я хочу, чтобы сделать этот вызов с помощью отраженияКак сделать общий методInvoke?

instanceOfEventPublisher.Publish<T>(T eventInst);

Когда я называю

` собственной недействительным 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» не найден.

Как назвать общий?

+0

Я думаю, что было бы легче ответить, если вы указали программирование язык. Это VB.Net? – abahgat

+0

abahgat: it is C# :) –

+0

Является ли метод публикации общедоступным или является универсальным IEventPublisher, а метод Publish принимает аргумент типа IEventPublisher как параметр? – Tinister

ответ

3

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

MethodInfo constructedPublish = thePublisher.GetMethod("Publish") 
    .MakeGenericMethod(theEventObject.GetType()); 
constructedPublish.Invoke(eventPublisher, new object[] { theEventObject }); 
0

Возможно использовать Открывающая кавычка обозначения:

Publish`1[[assemblyQualifiedNameOfTypeOfClassl]] 

(только предположение, а не тестировалось).

5

Вы должны использовать метод MakeGenericType как например:

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

Затем вы можете вызвать метод публикации, как вы его на realizedType. Это верно, если вы имеете дело с универсальным типом; однако, ваш код не выглядит так, как есть. Интерфейс, который вы используете для 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() }); 

    } 
+0

Я пересмотрел форматирование, проглотил , это должно быть instanceOfEventPublisher.Publish (T eventInst); – ruslander