If-else扩展名

时间:2016-02-25 16:29:23

标签: c# extension-methods

如果我需要对对象执行条件操作,我喜欢使用此扩展名:

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

但是我想知道如果我需要trueelse行动,最佳解决方案是什么?我的图像使用应该如下:

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扩展名。

所以,我的问题是:这可以分为两个单独的扩展(注意:两个扩展名仍应返回T)?

2 个答案:

答案 0 :(得分:0)

您可以让IfTrue返回一个新类,其中包含source对象的属性,并且条件为true,而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 };
}

答案 1 :(得分:0)

正如大多数评论所说 - 没有简单的方法可以使用两个单独的IfElse部分构建If-True-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;
}

此扩展程序可以执行thenelse操作,如果需要,仍然只能then