2

オブジェクトの不足している演算子のオーバーロードを無視し、代わりに実行時にそのチェックを処理するように C# コンパイラに強制する方法はありますか? int 型、string 型、ushort 型などのさまざまな属性を持つ複数のオブジェクトを含むコンテナーがあるためです。そのコンテナの検索機能を作っているのですが、いろいろな分野で検索できるようにしたいと思っています。

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

これは私が欲しいものです:

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

ID と Date がコンテナのオブジェクトのフィールドであると仮定します

これは私が今日しなければならないことです(ただし、動作します):

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

この追加のキャストは、最初の例と比べて見栄えがよくありません。これを行う必要はありません。代わりに実行時にこれをチェックするオプションが欲しいです。

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

4

1 に答える 1

3

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

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

あなたの場合、型がどうあるべきかを知っているので、キャストするだけです(あなたのように)。


より一般的なケースでは:

未知のタイプで、見Comparer.Default.Compareobject.Equals...

ジェネリックを使用。見てください-これで、、、および(ヌルなどを含む)にComparer<T>.Default.Compare(x,y)必要なすべてが実行されるはずです。同様にand (null などを含む) を処理します。>>=<<=EqualityComparer<T>.Default.Equals(x,y)==!=

その他の演算子 ( +、など)については-MiscUtilを参照してください。*

于 2009-07-03T11:35:43.400 に答える