2016-02-25 3 views
0

Мне нравится использовать это расширение, если мне нужно выполнить условное действие на объекте:Если-то еще расширение

T IfTrue<T>(this T source, Func<T, bool> shouldPerform, Action<T> action) { 
    if (shouldPerform(source)) { 
     action(source); 
    } 
    return source; 
} 

Но мне было интересно, что было бы лучшим решением, если мне нужно как true и else действия? использование изображения я должен выглядеть следующим образом:

someObject.IfTrue(self => ValidateObject(self), self => self.TrueAction()).Else(self => self.FalseAction());

Одна из возможностей я думал добавлял дополнительный параметр IfTrue метода:

T IfTrue<T>(this T source, Func<T, bool> shouldPerform, Action<T> trueAction, Action<T> falseAction = null) { 
    if (shouldPerform(source)) { 
     trueAction(souce); 
    } else if (falseAction != null) { 
     falseAction(source); 
    } 
    return source; 
} 

Но тогда я в конечном итоге использовать его в

someObject.IfTrue(self => ValidateObject(self), self => self.TrueAction(), self => self.FalseAction());

и не имея его дополнительно Else e XTension.

Итак, мой вопрос: можно ли разделить его на два отдельных расширения (обратите внимание: оба расширения все равно должны возвращать T)?

+5

Зачем использовать это вместо инструкции 'if/else'? 'source' уже находится в области видимости, поэтому вам не нужно возвращать его. – Lee

+0

@Lee Я использую расширение 'IfTrue', если мне нужно связать его другими методами. И возврат его обратно позволяет впоследствии добавить еще один метод в цепочку. –

+1

проблема в том, что цепочка iftrue предполагает, что цепочка имеет разные вещи в зависимости от результата (например, linq 'where'), в этом случае это не так. Это просто похоже на Fancy Code Syndrome – pm100

ответ

0

Как было сказано в большинстве комментариев, нет простого способа построить If-True-Else extenstion с двумя отдельными частями If и Else, поэтому я решил сделать это один:

[DebuggerStepThrough] 
internal static T If<T> (this T source, Func<T, bool> isTrue, Action<T> thenAction, Action<T> elseAction = null) { 
    if (isTrue (source)) { 
     thenAction (source); 
    } else { 
     elseAction?.Invoke (source); 
    } 
    return source; 
} 

Это расширение может принимать как then и else действия и по-прежнему быть в состоянии только лишь then, если это необходимо.

0

Вы могли бы IfTrue вернуть новый класс со свойствами для source объекта и погода условие истинно, и метод Else, как этот

class Conditional<T> // or however you want to call it 
{ 
    public T Source { get; set; } // the initial source object 
    public bool Result { get; set; } // weather the IfTrue method called the action 

    public void Else(Action<T> action) 
    { 
     if (!Result) 
      action(Source); 
    } 
} 

и изменить IfTrue быть, как это

Conditional<T> IfTrue<T>(this T source, Func<T, bool> shouldPerform, Action<T> action) { 
    if (shouldPerform(source)) { 
     action(source); 
     return new Conditional<T> { Source = source, Result = true }; 
    } 
    return new Conditional<T> { Source = source, Result = false }; 
} 
+0

Верно, но если я ** не буду нуждаться в дополнительной части, мне нужно будет написать дополнительное действие: 'someObject.IfTrue (...). Source' –

+0

Хорошо, теперь я понимаю, что вы пытаетесь делать. Но вам придется хранить результат 'shouldPerform' где-то ... – squill25

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