【问题标题】:Overloading Operator for Enums枚举的重载运算符
【发布时间】:2018-09-10 12:36:37
【问题描述】:

我对 C#.NET 中的运算符重载有点困惑

请检查以下示例

public enum TestActionResult
{
    NoResult,
    Fail,
    Pass,
    Exception
}

TestActionResult result = DetailsScreen.Text.Contains("YOUR DETAILS", StringComparison.OrdinalIgnoreCase) && DetailsScreen.Enabled && DetailsScreen.Displayed;

我希望发生的事情:

我想自动将boolean 值转换为TestActionResult

因此,如果我的结果对象右侧的布尔值为真,那么我希望 TestActionResultFalse 的情况下推断通过或失败。

我知道你可以在 C# 中进行运算符重载,我很确定这是可能的,但我不熟悉它是如何工作的。

我确实对此有所了解,但事实证明这是错误的xD

    public static TestActionResult operator == (bool b1, bool b2)
    {
        if(b1 && b2)
        {
            return TestActionResult.Pass;
        }
        return TestActionResult.Fail;
    }

    public static TestActionResult operator !=(bool b1, bool b2)
    {
        if(!(b1 && b2))
        {
            return TestActionResult.Pass;
        }
        return TestActionResult.Fail;
    }

任何帮助将不胜感激

我知道我可以使用三元操作数,但是对我来说它经常使代码行膨胀,我希望它采用更时尚的格式

例如

result = !bodyElement.GetAttribute("class").Contains("popup-visible") ? TestActionResult.Pass : TestActionResult.Fail;

这太长了,如果我可以通过运算符重载来减少它,我将非常感谢您的输入

【问题讨论】:

  • 在 C# 中似乎无法实现枚举运算符重载。 -> stackoverflow.com/questions/1355817/…
  • 您想在哪里添加这些运算符?你可以创建一个struct TestActionResult,它有一个属性ActionResult Result(这是你的枚举)。然后你可以在那里添加bool隐式运算符(或/和true/false运算符)。
  • 嗨蒂姆,我现在可以在任何地方添加这些操作数,你能给我一个小例子吗?
  • @JohnAntonyDanielNolan 对 bool 进行扩展怎么样。 bool.ToEnum() 即 ??
  • 哦,这很有趣,我对扩展非常熟悉,可以考虑创建一个扩展,根据布尔值给我一个 TestActionResult,如果我找不到解决方案,我会回到这个适合的问题谢谢!

标签: c# operator-overloading


【解决方案1】:

你在 C# 中 can't do operator overloading with enums。您可以将此enum 作为属性保存在classstruct 中,它可以隐式转换为bool,反之亦然:

public enum ActionResult
{
    NoResult,
    Fail,
    Pass,
    Exception
}

public struct TestActionResult
{
    public TestActionResult(ActionResult initialResult)
    {
        Result = initialResult;
    }

    private static readonly TestActionResult PassResult = new TestActionResult { Result = ActionResult.Pass };

    private static readonly TestActionResult FailResult = new TestActionResult { Result = ActionResult.Fail };

    public ActionResult Result { get; private set; }

    public static implicit operator TestActionResult(bool b)
    {
        return b ? PassResult : FailResult;
    }

    public static implicit operator bool(TestActionResult tar)
    {
        return tar.Result == ActionResult.Pass;
    }
}

【讨论】:

  • 谢谢。有用的信息
【解决方案2】:

如果您为 2 个布尔值覆盖运算符。这些运算符适用于您的项目...

我认为这是最简单的。

TestActionResult result = DetailsScreen.Text.Contains("YOUR DETAILS", StringComparison.OrdinalIgnoreCase) && DetailsScreen.Enabled && DetailsScreen.Displayed 
             ? TestActionResult.Pass 
             : TestActionResult.Failed;

或布尔的扩展

public static bool ToEnum(this bool value) {
    return value ? TestActionResult.Pass : TestActionResult.Failed;
}

然后

TestActionResult result =(DetailsScreen.Text.Contains("YOUR DETAILS", StringComparison.OrdinalIgnoreCase) && DetailsScreen.Enabled && DetailsScreen.Displayed)
                        .ToEnum();

【讨论】:

  • 谢谢蒂埃里我没有提到我想要一个不使用三元操作数的解决方案 - 我感谢您的帮助 +1 (Y)
猜你喜欢
  • 2011-02-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多