如何通过检查if语句来添加方法链

时间:2016-04-19 05:51:36

标签: c#

我不知道正确的术语,但我有一个简单的C#代码片段,它补充了一些像这样的对象:

camera.gameObject.transform.DOMove(target,3.0f)
.SetEase(Ease.InOutQuad)
.OnComplete(animation.FadeIn);

但我需要做的是根据这样的特定条件向该链添加另一种方法:

camera.gameObject.transform.DOMove(target,3.0f)                       
.SetEase(Ease.InOutQuad)            

  //the general idea
  if(visible == true){
  .OnStart(animation.FadeOut);
  }         

.OnComplete(animation.FadeIn);

显然这是一个语法错误,但我不知道正确的方法来处理这样的语法。

我应该怎样接近它?

2 个答案:

答案 0 :(得分:1)

您需要将整个块放在if - else语句中,不能将其分解:

if(visible == true){
  camera.gameObject.transform.DOMove(target,3.0f)                   
.SetEase(Ease.InOutQuad) .OnStart(animation.FadeOut).OnComplete(animation.FadeIn);
  }      
else {
  camera.gameObject.transform.DOMove(target,3.0f)                   
.SetEase(Ease.InOutQuad).OnComplete(animation.FadeIn);      
}   

Alertnatively:

var intermediateObject = camera.gameObject.transform.DOMove(target,3.0f)                   
    .SetEase(Ease.InOutQuad);

if (visible) {
    intermediateObject.OnStart(animation.FadeOut).OnComplete(animation.FadeIn);;
}
else {
    intermediateObject.OnComplete(animation.FadeIn);;
}

var关键字意味着您不需要自己担心对象的类型,但是再一次,它的使用确实会妨碍可读性(在我看来)。

答案 1 :(得分:1)

如果您想将所有内容保存在一个链中,可以尝试使用If扩展名:

internal static T If<T> (this T source, bool isTrue, Action<T> thenAction) {
    if (isTrue) {
        thenAction(source);
    }
    return source;
}

如果OnStart返回相同的camera对象,此扩展程序将有效。否则,应更改If扩展名。

然后你的代码看起来像这样:

camera.gameObject.transform.DOMove(target,3.0f).
    SetEase(Ease.InOutQuad)
    If(visible == true, value => value.OnStart(animation.FadeOut)).
    OnComplete(animation.FadeIn)

如果OnStart实际上返回了不同的object

internal static T If<T> (this T source, bool isTrue, Func<T, T> thenFunction) =>
    isTrue ? thenFunction(source) : source;