2011-12-26 5 views
1

В классе А, у меня естькак пройти любой метод в качестве параметра для другой функции

internal void AFoo(string s, Method DoOtherThing) 
{ 
    if (something) 
    { 
     //do something 
    } 
    else 
     DoOtherThing(); 
} 

Теперь мне нужно, чтобы быть в состоянии пройти DoOtherThing в AFoo(). Мое требование состоит в том, что DoOtherThing может иметь любую подпись с возвращаемым типом почти всегда недействительным. Нечто подобное из класса B,

void Foo() 
{ 
    new ClassA().AFoo("hi", BFoo); 
} 

void BFoo(//could be anything) 
{ 

} 

Я знаю, что могу сделать это с помощью Action или реализации делегатов (как это видно во многих других SO сообщений), но как это могло быть достигнуто, если сигнатура функции в классе B является неизвестно ??

+3

Как бы вы назвали функцию, если она имеет параметры? – erikH

+0

@erikH, который функционирует из партии? – nawfal

+0

@nawfal ??? Я имею в виду, например, DoSomething (int, string) как метод, нуждался бы в некоторых значениях в качестве аргументов ... – erikH

ответ

8

Вам необходимо сдать анкету delegate; Action будет работать нормально:

internal void AFoo(string s, Action doOtherThing) 
{ 
    if (something) 
    { 
        //do something 
    } 
    else 
        doOtherThing(); 
} 

Если BFoo это будет без параметров работы, как написано в вашем примере:

new ClassA().AFoo("hi", BFoo); 

Если нужны параметры, вы должны предоставить им:

new ClassA().AFoo("hi",() => BFoo(123, true, "def")); 
+0

чистый блеск, за один раз, как я вижу ... больше замечаний после компиляции :) – nawfal

0
public static T Runner<T>(Func<T> funcToRun) 
{ 
    //Do stuff before running function as normal 
    return funcToRun(); 
} 

Использование:

var ReturnValue = Runner(() => GetUser(99)); 

Я использую это для обработки на моем сайте MVC ошибки.

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