2009-07-03 7 views
2

C#コンパイラにオブジェクトの不足している演算子オーバーロードを無視させ、実行時にそのチェックを処理する方法はありますか? int、string、ushortなどのさまざまな属性を持つ複数のオブジェクトを持つコンテナがあるため、私は尋ねます。私はそのコンテナの検索機能を作っていて、さまざまなフィールドを検索できるようにしたいと考えています。オブジェクトをオペレータXに過負荷にすることを「想定」する方法を教えてください。

私は述語とラムダ式を使用しています。

これは私が欲しいものである:IDと日付を想定し

var data = container.Retrieve(ID => (ID == 5), Date => (Date > somedate)); 

コンテナのオブジェクトのフィールドですこれは私が(それが動作する、しかし)今日何をすべきかです:

var data = container.Retrieve(ID => ((int)ID == 5), Date => ((DateTime)Date > somedate)); 

最初の例に比べると、余分なキャスティングがあまり良く見えません。私はそれをする必要はありません。私は代わりに実行時にこれをチェックするオプションを持っていたいと思います。

これを達成する方法はありますか?

答えて

3

いいえ、C#3.0は型を知らない演算子をサポートしていません。

C#4.0ではdynamicで実行できますが、処理速度は遅くなります。

あなたのケースでは、を知っています。どのようなタイプでなければならないのですか(あなたのように)。より一般的なケースでは


:不明なタイプで

Comparer.Default.Compareobject.Equalsを見て...ジェネリックで

Comparer<T>.Default.Compare(x,y)をご覧ください。>>=<<=(ヌルなどを含む)のために必要なすべての作業を行う必要があります。同様にEqualityComparer<T>.Default.Equals(x,y)は、==!=(NULLなどを含む)を処理します。複数のオペレータのために

+-*など) - その後、私は私のキャストと一緒に暮らすよ、MiscUtil

+0

よし見てください。 クイックアンサーに乾杯。 :) – Hallgeir

+0

@Hallgeir:独自のオブジェクトを使用する場合、またはそれらから派生できる場合は、暗黙のキャスト演算子のオーバーロードを使用できます。これがあなたの状況に適用できるかどうかはわかりません。 – Abel