我对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;
这太长了,如果我可以通过运算符重载来减少它,我将非常感谢输入
答案 0 :(得分:4)
您在C#中can't do operator overloading with enums
。您可以将此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;
}
}
答案 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();