2016-07-16 6 views
1

Я новичок в Func/Action/Predicate и хочу знать, как лучше всего реорганизовать мой код, поскольку у меня потенциально будет много повторяющегося кода.Как реорганизовать несколько расширений с разными параметрами Func с одинаковым результатом

Я создал 2 методы расширения, которые принимают параметр Func (всегда возвращаются BOOL):

public static void MyExtension<T>(this T obj, Func<T, bool> predicate) 
    { 
     do 
     { 
      //function code 
     } while (predicate(obj)); 
    } 
    public static void MyExtension<T1, T2>(this T1 obj, T2 OtherObject, Func<T1, T2, bool> predicate) 
    { 
     do 
     { 
      //function code 
     } while (predicate(obj, OtherObject)); 
    } 

То, что я хочу, это только код Д.О./время цикла один раз, как я мог бы иметь много функций который будет генерировать только другой Func, но все захотят запустить тот же цикл do/while.

Я думал что-то вроде этого, которое принимает любой параметр Func и запускает его в каждом цикле. Код в цикле не заботится о типах, переданных в Func.

public static void DoLoop(Func predicate) 
    { 
     do 
     { 
      //function code 
     } while (predicate); 
    } 

Но это явно не работает. Кто-нибудь знает, как это решить, или я делаю что-то принципиально неправильное?

Конечный результат, я хочу, чтобы вызвать код, как показано ниже:

 var Obj = new MyObj(); 
     Obj.MyExtension((x) => x.Prop1.Contains("string")); 

     var OtherObj = new MyObj(); 
     Obj.MyExtension(OtherObj, (x,y) => x.Prop1.Contains("string") && y.Prop1.Contains("other")); 

Спасибо.

ответ

1

Поскольку ваши общие методы параметризуются на разных типах общих типов, вам необходимо сохранить все сигнатуры функций, чтобы код вызова был скомпилирован. Тем не менее, вы можете переместить реализацию в общий вспомогательный метод для уменьшения повторяющегося кода:

// This is your single implementation 
private static void DoLoop(Func<bool> predicate) { 
    do { 
     //function code 
    } while (predicate()); 
} 
// These are the wrappers 
public static void MyExtension<T>(this T obj, Func<T, bool> predicate) { 
    DoLoop(() => predicate(obj)); 
} 
public static void MyExtension<T1, T2>(this T1 obj, T2 OtherObject, Func<T1, T2, bool> predicate) { 
    DoLoop(() => predicate(obj, OtherObject)); 
} 

Упаковщики построить параметр меньше предикат, и передать его в частном DoLoop метод, который обеспечивает реализацию.

+0

безупречный! Благодарю. для его работы необходимо небольшое изменение. Необходимо изменить} while (предикат); to} while (предикат()); – Danhol86

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

  • Нет связанных вопросов^_^