【问题标题】:How to make your object act as another type when comparing?比较时如何使您的对象充当另一种类型?
【发布时间】:2011-01-16 00:22:17
【问题描述】:

我不记得如何在 C# 中将类与原始类型进行比较。

例子

public class Validate{
... //This is here that we would need to add code 
    //if I remember to make the object act as a boolean for example
}

...

Validate v = new Validate(...);
if(v==true)
{
...
}

你知道那个名字和怎么做吗?

【问题讨论】:

  • 您期望什么行为?你想自己控制吗?我的意思是,当有对象时,或者当它符合您的标准时,您是否希望 v 为真?
  • 我希望将 v 与 True/False 进行比较。我不想使用属性或方法...
  • 是的,但是您希望 True/False 代表什么?一个存在的对象可能有错误的值,那么它仍然是“真的”吗?

标签: c# .net c#-4.0


【解决方案1】:

我认为您正在寻找implicit type conversion

将以下方法添加到您的 Validate 类中:

    public static implicit operator bool(Validate v)
    {
        // Logic to determine if v is true or false
        return true;
    }

【讨论】:

  • 正是我想要的!谢谢楼主!
  • @Daok,我不认为这正是你想要的。不要使用隐式运算符,除非您可以有意义且可靠地将 Validate 的所有可能值映射到 bool 的值。如果你只是想做== true== false,那么我推荐下面hunter提供的算子重载解决方案。
【解决方案2】:

要做你想做的事,你需要重写隐式转换运算符:

public class MyObject
{
    private int i;

    public MyObject(int i)
    {
        this.i = i;
    }

    public static implicit operator bool(MyObject o)
    {
        return o.i % 2 == 0;
    }
}

如果字段i 为偶数,则上述示例将评估为真:

MyObject o1 = new MyObject(1);
MyObject o2 = new MyObject(2);

if (o1)
{
    Console.WriteLine("o1");
}

if (o2)
{
    Console.WriteLine("o2");
}

上面的输出是o2


但是,它的实现有点可怕,因为它会导致代码混乱,因为您的构造读作if (object),这对大多数读者来说是不熟悉的 - if (object.IsValid) 使意图更加清晰。

【讨论】:

    【解决方案3】:

    你的意思是运算符重载吗?

    public static bool operator == (Validate v, bool value) 
    {
        return /* some comparison */
        // or going off of the other posters answer
        return v.IsValid == value; 
    }
    

    【讨论】:

    • 他希望能够将 Validate 类与布尔值进行比较。
    • 是的,我知道。我认为您可以通过重载 ==!= 运算符来完成此操作。唯一想到的事
    【解决方案4】:

    只需将IsValid 属性添加到您的Validate 类并调用该属性:

    public class Validate
    {
        public bool IsValid
        {
            get { [implementation here] }
        }
    }
    
    ...
    
    Validate v = new Validate(...);
    if(v.IsValid)
    {
        ...
    }
    

    可以创建隐式运算符,但不建议以这种方式使用它,因为这会使您的代码难以被其他开发人员遵循。

    更新

    好的,只是为了完整性和教育,这是如何做到的:

    public class Validate
    {
        public bool IsValid
        {
            get { [implementation here] }
        }
    
        public static implicit operator bool(Validate v)
        {
            return v.IsValid;
        }
    }
    

    但同样,不要这样做。这会让你的代码很难理解。

    【讨论】:

    • 那不允许你这样做v == true 是吗?
    • @Filip:不,我认为这是一件好事。如果这确实是 OP 想要的,他应该在 Validate 类型上实现 public static implicit operator bool(Validate v) 方法。
    • @Daok:我知道你不想要,但请不要这样做。
    猜你喜欢
    • 2020-12-09
    • 2011-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-25
    • 1970-01-01
    • 2012-06-24
    相关资源
    最近更新 更多