2010-05-21 3 views
1

Y at-il de toute façon en C# d'appeler une méthode basée sur un Enum et/ou une classe? Dis si je devais appelerC# - Silverlight - Appeler dynamiquement une méthode

Controller<Actions.OnEdit, Customer>(customer); 

ce que je pourrais faire quelque chose comme ça, alors?

public void Controller<TAction, TParam>(TParam object) 
{ 
    Action<TParam> action = FindLocalMethodName(TAction); 
    action(object); 
} 

private Action<T> FindLocalMethodName(Enum method) 
{ 
    //Use reflection to find a metode with 
    //the name corresponding to method.ToString() 
    //which accepts a parameters type T. 
} 

Répondre

2

Cela devrait le faire. Supposons obj est l'objet que vous voulez appeler la méthode sur ...

var methodInfo = (from m in obj.GetType().GetMethods() 
        where m.Name == method.ToString() && 
         m.ReturnType == typeof(void) 
        let p = m.GetParameters() 
        where p.Length == 1 && 
         p[0].ParameterType.IsAssignableFrom(typeof(T)) 
        select m).FirstOrDefault(); 

return (Action<T>)Delegate.CreateDelegate(typeof(Action<T>), obj, methodInfo); 

Notez que la méthode a soit public ou accessible au code reflétant car il serait sans réflexion parce que Silverlight est très limité réflexion de méthodes non publiques.

+0

C'est très bien que la méthode soit publique, je ne veux pas avoir à encombrer mon viewmodel, moins j'écris de lignes de code, moins je fais d'erreurs, plus vite je peux faire les choses correctement. – cmaduro

+0

Tout à fait d'accord. J'ai utilisé cette technique pour exposer ICommands de mon ViewModel sans le fouillis de propriétés de commande. Je viens de chercher un CommandAttribute sur la méthode et j'ai bloqué une DelegateCommand dans un dictionnaire de commandes. – Josh

-1

Oui, vous devriez pouvoir le faire avec les API de réflexion.

C'est tout ce que vous vouliez savoir, n'est-ce pas? :)

Questions connexes