2010-05-21 5 views
1

В любом случае в C# для вызова метода на основе Enum и/или класса? Скажем, если бы я должен был назватьC# - Silverlight - Динамический вызов метода

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

Могу ли я сделать что-то вроде этого тогда?

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. 
} 

ответ

2

Это должно быть сделано. Предположим obj это объект, который вы хотите вызвать метод на ...

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); 

Обратите внимание, что метод имеет быть публичным или доступным для отражательной кода, как это было бы без отражения, потому что Silverlight имеет очень ограниченный отражение непубличных методов.

+0

Это нормально для того, чтобы метод был общедоступным, я просто не хочу загромождать свою модель просмотра, тем меньше строк кода я пишу, тем меньше ошибок я бы сделал, тем быстрее я могу все исправить правильно? – cmaduro

+0

Полностью согласен. Я использовал эту технику, чтобы вывести ICommands из моего ViewModel без беспорядка свойств команд. Я просто искал CommandAttribute в методе и вставил делегаткоманд в словарь команд. – Josh

-1

Да, вы должны быть в состоянии сделать это с помощью API-интерфейсов отражения.

Это все, что вы хотели знать, не так ли? :)

Смежные вопросы