Оператор перегрузки для перечислений - PullRequest
0 голосов
/ 10 сентября 2018

Я немного озадачен перегрузкой операторов в 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 вывести Pass или Fail, если 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 голосов
/ 10 сентября 2018

Вы не можете перегрузить оператор с помощью enums в C #. Вы можете хранить это enum как свойство в class или struct, которое неявно преобразуется в 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;
    }
}
0 голосов
/ 10 сентября 2018

Если вы переопределите оператор для 2 bools.Эти операторы применяются к вашему проекту ...

Я думаю, что это проще всего.

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

Или расширение для bool

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();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...