2009-06-25 8 views
2

Je me demande si je peux mettre à niveau un conteneur IoC basique que j'utilise pour supporter une charge paresseuse. Donc, si j'ai enregistré IFoo, je voudrais que le conteneur IoC sache comment remplir les deux dépendances suivantes (la première étant la manière standard de travailler avec les conteneurs IoC, la seconde retourne un simple délégué qui appelle le conteneur pour IFoo quand il est invoqué).Comment détecter si un type est un Func <T> et obtenir le type du T

public Bar(IFoo x) 

public Bar2(Func<IFoo> lazyFoo) 

Le problème survient lorsque j'essaie d'écrire le code qui va réellement le faire. Existe-t-il une syntaxe qui va compiler le pseudo-code suivant?

public T Resolve<T>() 
{ 
    if (T is Func<X>) 
     return (T)() => Resolve(typeof(X)); 
    return (T)Resolve(typeof(T)); 
} 

Ou poser ma question d'une autre manière, si j'ai un type T, comment puis-je détecter si elle est une instance de Func<X>, et si oui, quel est le type de X?

Répondre

3

un coup d'oeil à cette question ce matin - pourrait vous donner un bon départ - C# generic list <T> how to get the type of T?

+0

En effet, remplacer '' list' avec Func' et vous avez terminé ... –

+0

oui, on dirait que cela va le faire pour moi. merci Maintenant, j'ai un problème que le compilateur ne me laissera pas lancer de () => Resolve (theArgumentType) de retour à l'original T (même si j'essaie de lancer à l'objet d'abord). "Impossible de convertir l'expression lambda en type 'T' car ce n'est pas un type délégué" –

0

En réponse à la question dans le commentaire, vous devez appeler l'expression lambda, pas le jeter.

+0

Je ne veux pas encore l'appeler, je veux lui renvoyer le Func lui-même afin que l'appelant puisse l'appeler lorsqu'il est prêt à –

+0

Ensuite, vous devez le convertir en Func . – SLaks

+0

J'ai mal compris; voir la deuxième réponse. – SLaks

1

J'ai mal compris votre question.

Il est impossible de le faire dans une fonction comme vous l'essayez, car le compilateur doit avoir un type délégué pour créer le lambda au moment de la compilation.

Cependant, cela devrait fonctionner.

public T Resolve<T>() 
{ 
    return (T)Resolve(typeof(T)); 
} 

public Func<T> LazyResolve<T>() 
{ 
    return() => Resolve<T>(); 
} 
+0

ok je pense que je comprends pourquoi ce n'est pas possible. Dommage, parce que ce serait une fonctionnalité intéressante pour un conteneur IoC. –

Questions connexes