私は、ドキュメントを読んだ後に答えがノーだと感じています。関係演算子をサポートする型は、特定のインタフェースから派生していますか?
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);
等価をチェックするのに 'IComparable.CompareTo()'を使うべきではありません。 'IEquatable.Equals()'はそのための正しいメソッドです。 – svick
一般的な実装であるため、私はIEquatableを使用できません。シグネチャを 'Func prop = ...'に変更し、代わりに.Equalsを使用することを意味しない限り。 –
nullable