2017-08-11 5 views
0

J'essaie d'appeler Invoke() mais il jette toujours:ne peut pas appeler Invoke()

objet ne correspond pas au type cible

Je ne sais pas quoi passer en premier paramètre - en supposant que c'est le problème - et j'ai essayé beaucoup de choses sans succès. Ci-dessous va mon code:

var method = typeof(IBaseRepository<>).MakeGenericType(typeof(Domain.Model.Basic.City)) 
       .GetMethod("Get", BindingFlags.Instance | BindingFlags.Public); 

var entityData = method.Invoke(??, new[] { (object)id }); 

Le BaseRepository est:

public class BaseRepository<T> : IBaseRepository<T> 
{ 
    public virtual T Get(object id) { } 
} 

City classe est:

public class City : Entity 

Et Entity est une classe abstraite:

public abstract class Entity 

En tant que premier paramètre Invoke, j'ai essayé d'utiliser une instance de City - ce qui devrait être le bon cas - et une instance de Entity et d'autres choses dont j'étais sûr que cela ne fonctionnerait pas réellement.

+1

où vous avez '' ?? vous devez passer dans une instance de votre référentiel. –

+0

Spécifiquement, une instance de quelque chose qui implémente 'IBaseRepository ' –

+0

selon vos définitions de classe, cela devrait être un 'nouveau BaseRepository ()', depuis le premier argument de 'Invoke' est documenté comme "L'objet sur lequel invoquer la méthode ou le constructeur" – dlatikay

Répondre

0
//you are missing this part (FYI, this won't work if BaseRepo<T> is abstract) 
var repoType = typeof(BaseRepository<>).MakeGenericType(typeof(City)); 
var repo = repoType.GetConstructor(Type.EmptyTypes).Invoke(null); 

int id = 0; //whatever your id is... 

var method = typeof(IBaseRepository<>).MakeGenericType(typeof(City)) 
       .GetMethod("Get", BindingFlags.Instance | BindingFlags.Public); 
var entityData = (Entity)method.Invoke(repo, new[] { (object)id }) ; 
+0

Ouais ça marche. La seule différence dans ma solution finale était sur la partie «repo», que je dois * résoudre * avec mon injecteur de dépence, mais j'ai réussi à le faire fonctionner !! Vos conseils ont aidé, merci beaucoup. – DontVoteMeDown

+0

Quelqu'un est vraiment fou de cette question et est downvoting gratuitement .. – DontVoteMeDown

+0

Votre meilleure option serait de mettre une autre interface qui ne se soucie pas du paramètre de type générique et de le mettre sur vos repos ... Alors vous ne le faites pas besoin de réflexion. –