2014-10-21 2 views
0

Я пытаюсь создать метод, который принимает различные методы (Func s) в качестве параметра.
У меня есть небольшая проблема при определении аргументов Func. Предположим, что мне нужно вызвать некоторые вещи, как это:Как я могу назвать аргументы Func <int,int,int> в методе на C#?

public static void SomeTestMethod(int number,string str) 
{ 
    Check(MethodOne(number,str)); 
} 

И для проверки у меня есть это:

public static int Check(Func<int,string,int> method) 
{ 
     // some conditions 
     method(where should i get the arguments ?); 
} 

Теперь мой вопрос, как я должен установить необходимые аргументы? Я чувствую, что предоставляет отдельные аргументы для проверки, не изящно, так как мне нужно позвонить Check с сигнатурой i, указанной в TestMethod.
Я не хочу иметь

Check(MethodOne,arg1,arg2,etc)); 

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

Check(MethodOne(number,str)); 
+0

Это * очень * неясно, что вы просите. Если это даже компилируется, то 'MethodOne' возвращает' Func '. Это действительно поможет, если вы предоставите короткую, но полную программу, демонстрирующую проблему, и объясните, чего вы пытаетесь достичь. –

+0

Как мы должны знать? –

+0

Просто обратите внимание, что 'Func ' принимает только один параметр (int) и возвращает строку. Вы вызываете его так: 'var result = method (someInt);' - предположительно 'Check' должен затем рассуждать над' result' или возвращать его? – StuartLC

ответ

2

Я думаю вы хотите:

public static void SomeTestMethod(int number,string str) 
{ 
    Check(() => MethodOne(number,str)); 
} 

public static int Check(Func<int> method) 
{ 
     // some conditions 
     return method(); 
} 
+0

Спасибо, я полностью забыл про lambdas :), спасибо – Breeze

1
public static void Check<TReturnValue>(
         Func<int, string, TReturnValue> method, 
         int arg1, 
         string arg2) 
{ 
    method(arg1, arg2); 
} 

призвание:

public static SomeClass MethodOne(int p1, string p2) 
{ 
    // some body 
} 

Check(MethodOne, 20, "MyStr"); 

Вы пропустили тип возвращаемого значения (последний общий параметр означает тип возвращаемого значения). Если вы не хотите Func возвращения ничего, просто использовать Action:

public static void Check(
         Action<int, string> method, 
         int arg1, 
         string arg2) 
{ 
    method(arg1, arg2); 
} 
Смежные вопросы