2009-09-17 10 views
0

Contexte Je veux faire cet appel par réflexionComment faire un MethodInvoke générique?

instanceOfEventPublisher.Publish<T>(T eventInst);

Quand j'appelle

`{

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

`

Je reçois: System.MissingMethodException: La méthode 'EventAggregator.EventPublisher.Publish' est introuvable.

Comment appeler le générique?

+0

Je pense qu'il serait plus facile de répondre si vous avez indiqué la programmation la langue. Est-ce VB.Net? – abahgat

+0

abahgat: c'est C# :) –

+0

Est-ce que la méthode Publish est générique, ou est-ce que IEventPublisher est générique et la méthode Publish prend l'argument de type IEventPublisher comme paramètre? – Tinister

Répondre

3

Vous devrez peut-être faire GetMethods() et rechercher le "Publier" MethodInfo. Ou si "Publier" n'est pas surchargé, vous pourriez vous en sortir avec GetMethod("Publish"). Dans les deux cas, vous devrez appeler le MakeGenericMethod() sur le MethodInfo pour ajouter vos arguments de type.

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

Peut-être que vous utilisez la notation backtick:

Publish`1[[assemblyQualifiedNameOfTypeOfClassl]] 

(Juste une supposition, non testé).

5

Vous devez utiliser la méthode MakeGenericType comme par exemple:

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

Ensuite, vous pouvez appeler la méthode Publish que vous avez sur le realizedType. Ceci est vrai si vous traitez avec un type générique; Cependant, votre code ne ressemble pas à ça. L'interface que vous utilisez pour eventPublisher n'est pas une interface générique.

Pouvez-vous publier le reste de votre code, afin que nous puissions voir la définition de l'interface et les définitions de classe génériques.

Modifier

Voici quelques exemples de code que je fouetté montrant comment appeler une méthode sur un type générique par la réflexion:

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

J'ai révisé le formatage avalé il doit être instanceOfEventPublisher.Publish (T eventInst); – ruslander

Questions connexes