2011-09-08 6 views
1

私は、ドキュメントを読んだ後に答えがノーだと感じています。関係演算子をサポートする型は、特定のインタフェースから派生していますか?

Func<MyObject, object> greaterThan = obj => obj > 10; 
var results = myList.Where(greaterThan).ToList(); 
:私はのような何かを探しています>、> =など...

、<:しかし、私のような、それはタイプが関係演算子をサポートしているかどうかを知ることは可能ですかどうかを確認しようとしています

異なるプロパティで検索している可能性があるため、10進数、整数または浮動小数点数があります。私はMVCアクションでこれをやっているので、私が知る限りジェネリックをサポートすることはできません。私はそれを明らかに移動して汎用的な実装をすることができますが、まずこの答えを知りたいと思います。

暗黙的な演算子のオーバーロードは実現可能ではありません。その理由は、プロパティが実行時まで知られていないということです(申し訳ありません)。したがって、ジェネリックを使用することはできません。任意のプロパティを考えると、私はそれはこれが(完全にテストされていない)動作しているようだ私の現在の実装のやや不自然な例では0ではないことを確認する必要があります。

Func<MyObject, IComparable> prop = obj => isOn ? obj.DecimalVal : obj.IntValue; 
Func<MyObject, bool> clause = obj => prop(obj).CompareTo(0) != 0; 
var results = myList.Where(clause); 

私はただのCompareToが戻ることを願っています0;たとえpropがint型と比較して0の値を持つ小数点を評価したとしても、これらの型は異なっています。私ははっきりと私の希望が高すぎる設定していた

UPDATE

、上記のアプローチに失敗しました。したがって、私が今使っている解決策は望ましくないが、うまくいく。私はよりエレガントなアプローチを聞きたいです。

Func<MyObject, dynamic> prop = obj => isOn ? obj.DecimalVal : obj.IntValue; 
Func<MyObject, bool> clause = obj => prop(obj) != 0; 
var results = myList.Where(clause); 
+0

等価をチェックするのに 'IComparable.CompareTo()'を使うべきではありません。 'IEquatable.Equals()'はそのための正しいメソッドです。 – svick

+0

一般的な実装であるため、私はIEquatableを使用できません。シグネチャを 'Func prop = ...'に変更し、代わりに.Equalsを使用することを意味しない限り。 – nullable

答えて

3

いいえ。C#では、演算子は型の静的メンバーであるため、インターフェイスの一部ではありません。

C#4で動作するようにあなたのコードのための一つの方法があります:dynamicは:

Func<dynamic, bool> greaterThan = obj => obj > 10; 
var results = myList.Cast<dynamic>().Where(greaterThan).ToList(); 

これはmyListint秒、double秒またはdecimalのコレクションであるかどうか動作します。

を(しかしresultsタイプList<dynamic>であり、注意)しかし、.NETはactallyオペレータは、一般に使用されるのと同じ目的に使用することができるいくつかのインターフェースを提供する:等式(IEquatable<T>)のために比較し、要素が大きい比較いるとそれはより小さい(IComparable<T>)。これらのコードでは、次のようなコードを書くことができます。

static IEnumerable<T> GreaterThan<T>(this IEnumerable<T> collection, T item) 
    where T : IComparable<T> 
{ 
    return collection.Where(x => x.CompareTo(item) > 0); 
} 
+0

+1はダイナミックで、これは私の頭を越えていませんでした。演算子は静的なメンバーでもありませんでした! – nullable

+0

+1動的で、IEquatable とIComparable の使用方法の詳細については、 – Sumo

2

IComparable<T>IEqutable<T>インターフェースを使用してについて。これらは、オブジェクト間の一般的な比較を実行するように設計されています。

1

ここでimplicit operator overloadingを使用できます。また、等価性を実装するためにIEquatableを使用することについての@ gmamaladzeの答えと、並べ替えのための比較のためのIComparableについても検討します。

+0

変換演算子を使用してここでどのように役立つのかを明確にできますか? – svick

0

いいえいいえ。 < > >= <=のような演算子をサポートするには、クラスの演算子を明示的に定義します。 Operator overloading

クラス内にimplicit castsを定義することもできます。これにより、オブジェクトを暗黙的に対象の型にキャストしてから、数学演算を実行できます。 This articleはあなたに役立つようです。

関連する問題