【问题标题】:Call one of two methods dynamically [duplicate]动态调用两种方法之一[重复]
【发布时间】:2019-09-27 16:30:03
【问题描述】:

有没有办法转换这个 if/else 语句,以便在不使用反射的情况下以更动态的方式调用它?

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

在 JavaScript 中我可以执行以下操作,我想知道 C# 中是否有类似的东西。

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

【问题讨论】:

  • 有很多可用的源代码混淆器可以更彻底、更有效地实现相同的效果。
  • 这可能更适合Code Review
  • @EdPlunkett 好的,谢谢。
  • 如果你有一个大的逻辑序列,也许责任链模式概念的简单应用会有所帮助。

标签: c#


【解决方案1】:

看看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

我想我正在回答你的问题,但基于你问题中的一些 cmets(我目前无法评论),我有点担心我没有回答。

【讨论】:

  • 鉴于 OP 的问题本质上是要求一种混淆代码的方法,我认为这是对 OP 提出的问题的合理回答。
  • 酷。谢谢你让我没有安全感的自己放心。 :D
【解决方案2】:

在 C# 中不可能。

你的代码有什么问题,它很好而且很简单。

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

但是你可以这样写:

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

【讨论】:

  • 我认为 OP 寻找的不仅仅是任何旧的糟糕代码,而是特别脆弱、神秘和简洁的糟糕代码。我认为这里没有满足最后三个要求中的任何一个。
  • 开关是个玩笑...
  • 我的评论也是如此。
【解决方案3】:

三元运算符必须返回一些东西。您可以执行以下操作来返回具有您正在寻找的效果的 Action 委托:

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

doThisdoThat 是方法。

【讨论】:

  • 这可能是一个不错的解决方案:它可以编译,并且对可读性和可维护性具有预期的效果。但是,它需要适应在directions 集合上调用实例方法。
  • 不要复制其他人对类似问题的回答,请投票以重复关闭此问题(此答案是:stackoverflow.com/questions/5490095/… 的副本)
猜你喜欢
  • 2014-05-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-24
  • 1970-01-01
  • 2014-08-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多