2009-08-06 7 views
0

J'ai rencontré un petit problème en essayant de résoudre une interface dans le château en utilisant la réflexion.Castle Windsor Résolution d'interface par réflexion

Disons que j'ai une interface IService, et peut le résoudre comme ceci:

var service = wc.Resolve<IService>(); 

Cela fonctionne comme prévu, mais je veux appeler la méthode par la réflexion et peut le faire comme ceci:

MethodInfo method = typeof(WindsorContainer).GetMethod("Resolve",new Type[] {}); 
MethodInfo generic = method.MakeGenericMethod(typeof(IService)); 
var service = generic.Invoke(wc,new object[]{}); 

Cela fonctionne également très bien. Maintenant, imaginons que je veux sélectionner le type à supprimer en utilisant la réflexion.

Type selectedType = assembly.GetType("myProject.IService") 

Et puis essayez de l'appeler comme ceci:

MethodInfo method = typeof(WindsorContainer).GetMethod("Resolve",new Type[] {}); 
MethodInfo generic = method.MakeGenericMethod(selectedType); 
var service = generic.Invoke(wc,new object[]{}); 

J'obtiens une erreur Castle:

"No component for supporting the service myProject.IService was found" 

Le type de selectedType semble être correct, mais il y a un problème .

Est-ce que quelqu'un sait ce que je peux faire pour invoquer la méthode de résolution correctement?

BTW MakeGenericMethod(typeof(selectedType) ne compile pas.

Merci à l'avance

Répondre

2

Pourquoi avez-vous besoin même MakeGenericMethod? Castle has a non-generic Resolve method

Est-ce que seulement container.Resolve(selectedType) fonctionne?

+0

container.Resolve (selectedType) produit la même erreur. Merci pour le pointeur sur la méthode non générique. – jheppinstall

1

Avez-vous enregistré un composant pour IService? Cela fonctionne très bien pour moi:

using System; 
using Castle.Windsor; 
using NUnit.Framework; 

namespace WindsorInitConfig { 
    [TestFixture] 
    public class ReflectionInvocationTests { 
     public interface IService {} 

     public class Service: IService {} 

     [Test] 
     public void CallReflection() { 
      var container = new WindsorContainer(); 
      container.AddComponent<IService, Service>(); 

      var selectedType = Type.GetType("WindsorInitConfig.ReflectionInvocationTests+IService"); 
      var method = typeof(WindsorContainer).GetMethod("Resolve", new Type[] { }); 
      var generic = method.MakeGenericMethod(selectedType); 
      var service = generic.Invoke(container, new object[] { }); 
      Assert.IsInstanceOfType(typeof(IService), service); 
     } 
    } 
} 
+0

Merci pour votre réponse, j'ai eu un composant enregistré dans un fichier .config, qui a produit le comportement ci-dessus. À la fin, j'ai ajouté un composant en utilisant la méthode AddComponent, qui a fonctionné, mais qui a un peu vaincu l'objet. Maintenant, je peux résoudre en utilisant la clé de chaîne, mais avoir une dépendance dans le code, pas dans la configuration. – jheppinstall

Questions connexes