枚举重载运算符

时间:2018-09-10 12:36:37

标签: c# operator-overloading

我对C#.NET中的运算符重载感到困惑

请检查以下示例

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

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

我想发生的事情:

我想将boolean值自动转换为TestActionResult

因此,如果结果对象右侧的布尔值是true,那么我想TestActionResult推断出False的通过或失败。

我知道您可以在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;

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

2 个答案:

答案 0 :(得分:4)

您在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;
    }
}

答案 1 :(得分:1)

如果您为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();