2013-08-20 20 views
11

Czy można utworzyć metodę, która przyjmuje DOWOLNĄ metodę (niezależnie od jej parametrów) jako parametr? Metoda miałaby również parametr params, który następnie pobiera wszystkie parametry dla parametru-metody.C# Dowolna funkcja jako parametr

Więc w zasadzie to, co chcę jest mniej więcej tak:

public void CallTheMethod(Action<int> theMethod, params object[] parameters) 

Ale wtedy żadnej metody, nie tylko dla metod, które zajmuje int.

Czy coś takiego jest możliwe?

Dzięki

+6

Cóż, można zdać nieswoiste 'Delegate', ale' DynamicInvoke' jest * sloooooowwwwww * (relatywnie rzecz biorąc) –

+5

Po prostu z ciekawości, jak byłoby to bardziej przydatne niż bezpośrednie wywoływanie metody? Muszę powiedzieć, że jestem zaintrygowany. –

+1

Z ciekawości, jaki jest sens tego? Wydaje się bardzo podatny na błędy. Dlaczego po prostu nie uruchomić metody? – Dennisch

Odpowiedz

6

Tak, z delegatem:

public object CallTheMethod(Delegate theMethod, params object[] parameters) 
{ 
    return theMethod.DynamicInvoke(parameters); 
} 

ale patrz Marc Gravell's comment na swoje pytanie :)

Well, you could pass the non-specific Delegate , but DynamicInvoke is sloooooowwwwww (relatively speaking)

+1

Nie mogę sprawić, żeby zadziałało. Wystąpił błąd: "Nie można przekonwertować z" grupy metod "na" System.Delegat "" To, co mam, to metoda "DoSomething (liczba int)" A następnie twoja metoda. Więc spróbowałem "CallTheMethod (DoSomething, 5)", a następnie dostaję błąd ... Czy robię coś nie tak, lub Czy jest jakiś haczyk, o którym nie wiem? –

5

Jest to możliwe, ale nie to, co powinno być zrobione.

To jest to, co chciałbym zrobić:

public void CallTheMethod(Action toCall) 

Możecie iść "prawda". Zasadniczo, co pozwala użytkownikowi zrobić to w ten sposób:

CallTheMethod(() => SomeOtherMethod(with, some, other, parameters)); 

Jednakże, jeśli chcesz, aby powrócić typu, wiąże rodzajowych:

public void CallTheMethod<T>(Func<T> theMethod) 

można umieścić rodzajowe ograniczeń tego typu, wykonaj cokolwiek zechcesz, itp.

+0

To prawda, ale to, o co pytam, nie wydaje się być dobrą rzeczą, chociaż Jedność chce nazwy metody podczas wywoływania RPC, więc chciałem napisać małe opakowanie, więc nie muszę mocno kodować nazwy metody Czy możesz również rzucić okiem na komentarz na temat odpowiedzi Mattena? Wydajesz się być bardzo dobrze poinformowany o C#. Dzięki! –

3

Tak. Można użyć DynamicInvoke zadzwonić metody:

Action<int> method1 = i => { }; 
Func<bool, string> method2 = b => "Hello"; 

int arg1 = 3; 
bool arg2 = true; 
//return type is void, so result = null; 
object result = method1.DynamicInvoke(arg1); 

//result now becomes "Hello"; 
result = method2.DynamicInvoke(arg2); 

metoda to zrobić staną:

object InvokeMyMethod(Delegate method, params object[] args) 
{ 
    return method.DynamicInvoke(args); 
}