是否有一种方法可以转换此if / else语句,以便可以在不使用反射的情况下以更动态的方式对其进行调用?
if (left.IsColliding()) directions.Remove(Direction.Left);
else directions.Add(Direction.Left);
在JavaScript中,我可以执行以下操作,并且我想知道C#中是否存在类似的内容。
directions[left.IsColliding() ? "Remove" : "Add"](Direction.Left);
答案 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)();
doThis
和doThat
是方法。