2016-11-07 4 views
0

Мне нужно создать функцию, которая будет выполнять другие функции (всегда различное их количество). Может кто-то мне помочь, пожалуйста?C# - Передача функций (с аргументами) в качестве аргументов функции

Функция DoThisFunction будет иметь разные типы и количество параметров. может быть различное количество функций условия.

Я постараюсь показать здесь:

bool MyFunction(condition1(args), condition2(args), condition3(args), ... , DoThisFunction(args)) 
{ 
    ... 
    if (condition1(int x) == true && condition2(int x, string C) == 5) 
    { 
     DoThisFunction(par1, par2, par3 ...); 
     return true; 
    } 
} 

bool condition1(int x) 
{ 
if (x>5) 
    return true; 
else 
    return false; 
} 

int condition2(int x, string C) 
{ 
.... 
return par1; 
} 

и т.д ...

Тогда мне нужно позвонить:

bool z = MyFunction(condition1(int x)==true, condition2(int x, string C)==5, DoThisFunction(par1, anotherArguments ...)) 
+7

Я не знаю, чего вы пытаетесь достичь, но у меня такое чувство, что вы идете не так. –

+1

Почему бы вам просто просто снаружи просто сделать: 'if (condition1 && condition2 && condition3) DoThisFunction (...);'? Почему вам нужно абстрагироваться от фактического вызова ко всему? Какую проблему вы пытаетесь решить здесь? –

+0

Причина аргументов «условий» вычисляется внутри MyFunction. –

ответ

1

Я хотел бы предложить другой подход для вашего кода. Может быть, вы можете сохранить список, разделенный со всеми функциями, которые необходимо проверить, и запустить каждый метод внутри очень простой цикл (Еогеасп), в этом случае:

  • код будет очень дружелюбным (легко понимать)
  • лучше ремонтопригодность
  • вы можете просмотреть меньше кода и добавить больше функциональных возможностей (например, вы можете вводить код и просто добавить еще Func <> в ваш список <>)

Пожалуйста, примите взглянуть на в следующем примере:

static class Program 
{ 
    private static void Main(string[] args) 
    { 
     var assertions = new List<Func<object[], bool>> 
     { 
      Assertion1, 
      Assertion2, 
      Assertion3 
     }; 

     var yourResult = Assert(assertions, 1, "1", true); 
     Console.WriteLine(yourResult); // returns "True" in this case 
     Console.ReadLine(); 
    } 

    private static bool Assert(IEnumerable<Func<object[], bool>> assertions, params object[] args) 
    { 
     // the same as 
     // return assertions.Aggregate(true, (current, assertion) => current & assertion(args)); 

     var result = true; 

     foreach (var assertion in assertions) 
      result = result & assertion(args); 

     return result; 
    } 

    private static bool Assertion1(params object[] args) 
    { 
     return Convert.ToInt32(args[0]) == 1; 
    } 

    private static bool Assertion2(params object[] args) 
    { 
     return Convert.ToInt32(args[0]) == Convert.ToInt32(args[1]); 
    } 

    private static bool Assertion3(params object[] args) 
    { 
     return Convert.ToBoolean(args[2]); 
    } 
} 
1

Это решение представляется общим для вашей проблемы.

Для проверки предварительных условий перед выполнением методов взглянуть на Code Contracts

0

Вы можете использовать функтор как следующее:

private bool MyFunction(Func<int, bool> condition1, Func<int,string,int> condition2, Func<int,string,int, int> doThisFunction, int x, string str) 
{ 
    if (condition1(x) && condition2(x, str) == 5) 
     return doThisFunction(x, str, x) == 10; 
    return false; 
} 

Затем вызовите эту функцию в вашем коде как ниже:

MyFunction(x => x > 5 ? true : false, (x, C) => C.Length == x * 5 ? 5 : C.Length, 
      (x, str, y) => 
      { 
       if (x + y > str.Length) 
        return 5; 
       else if (x * y > 5) 
        return 10; 
       else 
        return 15; 
      }, 10, "Csharp"); 
+0

Спасибо, это кажется многообещающим с некоторой перегрузкой (потому что функция MyFunction должна принимать каждый раз различное количество аргументов), но я не знаю, как это работает «лямбда» (=>). –

+0

Более подробную информацию о лямбда-выражениях можно найти в [этой ссылке] (https://msdn.microsoft.com/en-us/library/bb397687.aspx). – OmG

+0

Спасибо. Я знаю, я пытаюсь понять это в течение некоторого времени, но я думаю, это слишком много для меня. –

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