Как заставить ваш объект выступать в качестве другого типа при сравнении? - PullRequest
2 голосов
/ 16 января 2011

Я не помню, как сделать в 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 ]

2 голосов
/ 16 января 2011

Чтобы сделать то, что вы хотите, вам нужно переопределить неявный оператор приведения:

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

Приведенный выше пример оценивается как true, если поле 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) делает намерение намного более ясным. 1014 *

2 голосов
/ 16 января 2011

Я думаю, вы ищете неявное преобразование типов .

Добавьте следующий метод в ваш класс Validate:

    public static implicit operator bool(Validate v)
    {
        // Logic to determine if v is true or false
        return true;
    }
1 голос
/ 16 января 2011

Просто добавьте свойство 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;
    }
}

Но опять же, не делайте этого.Это сделает ваш код довольно сложным для отслеживания.

1 голос
/ 16 января 2011

Вы имеете в виду перегрузку оператора?

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