2011-01-16 4 views
2

私は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) 
{ 
... 
} 

あなたがその名前を知っていますし、どのようにそれを行うには?

+0

[C#Custom Object Validation Design]の可能な複製(http://stackoverflow.com/questions/1290251/c-custom-object-validation-design) –

+0

あなたはどのような動作を期待していますか?それを自分でコントロールできるようにしたいですか?つまり、オブジェクトがあるとき、またはそれがあなたの基準に合っているときにvを真似したいのですか? –

+0

私はそれをTrue/Falseと比較したいと思います。私はプロパティやメソッドを使用したくない... –

答えて

2

私はあなたがimplicit type conversionを探していると思います。

があなたの検証クラスに次のメソッドを追加します。上記の例では、trueに評価されます

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

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

素敵な、これを掘る – hunter

+0

まさに私が欲しい!ありがとうございます! –

+0

@Daok、これはまさにあなたが望むものだとは思わない。有意義かつ確実に 'Validate'のすべての値を' bool'の値にマップすることができない限り、暗黙の演算子を使用しないでください。 '== true'と' == false'だけを実行したい場合は、以下の* hunter *によって提供される演算子オーバーロードソリューションをお勧めします。 – Timwi

1

演算子のオーバーロードを意味しますか?

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

クラスValidateをブール値と比較できるようにしたいと考えています。 –

+0

ええ、私は知っています。私はあなたが '=='と '!='演算子をオーバーロードすることでこれを達成できると思います。 – hunter

1

ちょうどあなたのValidateクラスにIsValidプロパティを追加し、そのプロパティを呼び出す:

public class Validate 
{ 
    public bool IsValid 
    { 
     get { [implementation here] } 
    } 
} 

... 

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

ので、暗黙の演算子を作成することは可能であるが、このようにそれを使用することはお勧めできませんあなたのコードを他の開発者に追いつけないようにします。

オーケー

UPDATEは、単に完全性と教育のために、これはそれを行う方法です:

public class Validate 
{ 
    public bool IsValid 
    { 
     get { [implementation here] } 
    } 

    public static implicit operator bool(Validate v) 
    { 
     return v.IsValid; 
    } 
} 

しかし、再び、それをしないでください。それはあなたのコードに従うのはかなり難しいでしょう。

+0

あなたは 'v == true'を実行することを許可していませんか? –

+0

申し訳ありません。 –

+1

@Filip:いいえ、それは良いことだと思う。これが本当にOPが望むものなら、 'Validate'型で' public static暗黙の演算子bool(Validate v) 'メソッドを実装するべきです。 – Steven

2

はあなたが欲しいものを行うには、暗黙のキャスト演算子をオーバーライドする必要がありますフィールド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)は、はるかに明確な意図を行います。

+0

+1は混乱を招く悪い習慣であると言っています。 – Steven

関連する問題