比较时如何让你的对象作为另一种类型?

时间:2011-01-16 00:22:18

标签: c# .net c#-4.0

我不记得在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)
{
...
}

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

4 个答案:

答案 0 :(得分:2)

我认为你正在寻找implicit type conversion

将以下方法添加到Validate类:

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

答案 1 :(得分: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是偶数,则上面的示例将评估为true:

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)使意图更多更清楚。

答案 2 :(得分:1)

你的意思是运算符重载?

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

答案 3 :(得分:1)

只需将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;
    }
}

但是,再说一遍,不要这样做。它会使你的代码很难遵循。