2009-03-18 7 views
15

Je dois mettre en œuvre la méthode:création d'exécution de générique Func <T>

object GetFactory(Type type); 

Cette méthode doit retourner un Func <T> où typeParam 'T' est le 'type'.

Donc, mon problème est que je ne sais pas comment créer un Func <? > à l'exécution en utilisant la réflexion. Activator.CreateInstance ne fonctionne pas car il n'y a aucun constructeur sur les délégués.

Des idées?

Répondre

23

Vous utilisez Delegate.CreateDelegate, c'est-à-dire à partir d'un MethodInfo; ci-dessous, je l'ai codé en dur, mais vous utiliseriez une certaine logique, ou Expression, pour obtenir la méthode de création réelle:

using System; 
using System.Reflection; 
class Foo {} 

static class Program 
{ 
    static Func<T> GetFactory<T>() 
    { 
     return (Func<T>)GetFactory(typeof(T)); 
    } 
    static object GetFactory(Type type) 
    { 
     Type funcType = typeof(Func<>).MakeGenericType(type); 
     MethodInfo method = typeof(Program).GetMethod("CreateFoo", 
      BindingFlags.NonPublic | BindingFlags.Static); 
     return Delegate.CreateDelegate(funcType, method); 
    } 
    static Foo CreateFoo() { return new Foo(); } 
    static void Main() 
    { 
     Func<Foo> factory = GetFactory<Foo>(); 
     Foo foo = factory(); 
    } 
} 

Pour les méthodes non statiques, il y a une surcharge de Delegate.CreateDelegate qui accepte l'instance cible .

+0

Mark, je ne sais pas vraiment ce qu'est T. Si je savais ce que T est, ce serait facile. –

+0

Vous voulez dire dans la méthode non générique? Je vais mettre à jour ... –

+0

J'ai modifié la question pour mieux indiquer mon problème. –

0

Je pense que l'approche habituelle serait de faire de la version "stupide" la chose que vous usurperez à runtme, et ensuite de fournir une méthode d'extension auxiliaire pour fournir la version sécurisée.

+0

Donc, ceci est dans les entrailles d'un conteneur IoC, et je dois retourner l'objet comme une dépendance fortement typée, ne sachant pas nécessairement que ce qui était demandé était un Func (ce pourrait être un Uri ou une chaîne). –

0

Vous pouvez créer des objets Expression au lieu d'un func et compiler() l'expression pour obtenir un délégué Func.

Questions connexes