如果我需要对对象执行条件操作,我喜欢使用此扩展名:
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
扩展名。
所以,我的问题是:这可以分为两个单独的扩展(注意:两个扩展名仍应返回T
)?
答案 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)
正如大多数评论所说 - 没有简单的方法可以使用两个单独的If
和Else
部分构建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;
}
此扩展程序可以执行then
和else
操作,如果需要,仍然只能then
。