2013-09-27 3 views
1

Permettez-moi de préface en disant que je suis complètement nouveau à la réflexion.Mélanger la réflexion avec les appels standard

J'ai un Dictionary de string à Func<string, string>. Je voudrais ajouter une section de configuration qui me permettrait de définir le nom des méthodes statiques qui peuvent être ajoutées par programme dans ce dictionnaire.

Donc, fondamentalement, je l'aurais quelque chose comme ceci:

public static void DoSomething() 
{ 
    string MethodName = "Namespace.Class.StaticMethodName"; 

    // Somehow convert MethodName into a Func<string, string> object that can be 
    // passed into the line below 

    MyDictionary["blah"] = MethodNameConvertedToAFuncObject; 
    MyDictionary["foo"] = ANonReflectiveMethod; 

    foreach(KeyValuePair<string, Func<string, string>> item in MyDictionary) 
    { 
     // Calling method, regardless if it was added via reflection, or not 
     Console.WriteLine(item.Value(blah)); 
    } 
} 

public static string ANonReflectiveMethod(string AString) 
{ 
    return AString; 
} 

Est-il possible de le faire, ou dois-je tout invoqué par la réflexion?

+1

Qu'est-ce que vous essayez d'obtenir avec ce becouse je pense que vous faites de sérieuses erreurs. –

+0

@PeterKiss en un mot, je fais un système de filtrage similaire à celui de wordpress. Vous donnez un nom au filtre, puis fournissez une méthode de rappel. J'utilise des formulaires Web ASP.NET. Je l'ai installé à l'endroit où je peux ajouter un filtre fournissant dans une méthode de rappel, mais je voudrais ajouter "Global Filters", qui sont essentiellement ajoutés via des chaînes dans le web.config. Je tiens à noter que je veux filtrer les données avant qu'elles ne soient dans la réponse, donc un simple HttpModule n'est pas ce que je recherche. –

Répondre

4

Je pense que tout ce que vous cherchez est Delegate.CreateDelegate. Vous devrez casser le nom que vous avez dans un nom de classe et un nom de méthode. Vous pouvez ensuite utiliser Type.GetType() pour obtenir le type, puis Type.GetMethod() pour obtenir le MethodInfo, utilisez alors:

var func = (Func<string, string>) Delegate.CreateDelegate(
          typeof(Func<string, string>), methodInfo); 

Une fois que vous avez créé le délégué, vous pouvez le mettre dans le dictionnaire sans problème.

donc quelque chose comme:

static Func<string, string> CreateFunction(string typeAndMethod) 
{ 
    // TODO: *Lots* of validation 
    int lastDot = typeAndMethod.LastIndexOf('.'); 
    string typeName = typeAndMethod.Substring(0, lastDot); 
    string methodName = typeAndMethod.Substring(lastDot + 1); 
    Type type = Type.GetType(typeName); 
    MethodInfo method = type.GetMethod(methodName, new[] { typeof(string) }); 
    return (Func<string, string>) Delegate.CreateDelegate(
     typeof(Func<string, string>), method); 
} 

Notez que Type.GetType() ne trouvera types dans l'assemblage en cours d'exécution ou mscorlib sauf si vous spécifiez en fait un nom qualifié d'assembly. Juste quelque chose à considérer. Vous pouvez utiliser Assembly.GetType() à la place si vous connaissez déjà l'assemblage dans lequel vous trouverez la méthode.

+0

J'avais toutes les pièces, je ne savais pas comment elles s'emboîtaient :). J'ai fini par utiliser le GetMethod (methodName, BindingFlags.Static | BindingFlags.Public); surcharge pour spécifier l'inclusion de la méthode statique. Savez-vous si ces indicateurs de liaison sont requis pour obtenir des méthodes statiques, ou si la recherche par type d'argument (comme dans votre exemple) est suffisante pour trouver une méthode statique? Très appréciée! –

+1

@PaulZaczkowski: Oui, cela va le trouver - et surtout, il évite les problèmes lorsqu'il y a plusieurs surcharges. Cependant, vous devrez spécifier des indicateurs de liaison pour une méthode non publique. –

+0

Parfait, merci encore. –

Questions connexes