动态调用两种方法之一

时间:2019-09-27 16:30:03

标签: c#

是否有一种方法可以转换此if / else语句,以便可以在不使用反射的情况下以更动态的方式对其进行调用?

if (left.IsColliding()) directions.Remove(Direction.Left);
else directions.Add(Direction.Left);

在JavaScript中,我可以执行以下操作,并且我想知道C#中是否存在类似的内容。

directions[left.IsColliding() ? "Remove" : "Add"](Direction.Left);

3 个答案:

答案 0 :(得分:0)

在C#中不可能。

简单又好用的代码有什么问题。

JavaScript版本丑陋且有问题,因为使用硬编码的字符串调用方法是潜在的错误来源,并且难以维护。

但是你可以这样写:

switch ( left.IsColliding() )
{
  case true:
    directions.Remove(Direction.Left);
    break;
  case false:
    directions.Add(Direction.Left);
    break;
}

答案 1 :(得分:0)

看看Func<T, TResult>

它使您必不可少的是定义一个函数,然后在以后调用它。

因此,您可以将字符串“删除”和“添加为键”添加到Dictionary<string, Func<T, TResult>中。

您可以使用与JavaScript提到的语法相同的三进制。因此,您将只使用它而不是if语句。

https://docs.microsoft.com/en-us/dotnet/api/system.func-2?view=netframework-4.8

我想我正在回答您的问题,但是基于您的问题中的一些评论(到目前为止我还无法评论),我有点担心我没有。

答案 2 :(得分:-1)

三元运算符必须返回某些内容。您可以执行以下操作以返回Action委托,该委托具有您想要的效果:

int a = 5;
int b = 10;
(a == b ? (Action)doThis : doThat)();

doThisdoThat是方法。

相关问题