0

任意の型の 2 つのオブジェクトを動的に比較できる汎用演算子メソッドを作成しています。例えば:

Object a = (int)5;
Object b = (long)7;
return a < b;

object が less than 演算子を提供しないため、これは明らかにコンパイルされません。オブジェクトをそれぞれの型にキャストすることは明らかに機能します。

ただし、実行時の型はわかりません。

.NET 4 を使用できれば (これは使用できません)、オブジェクトを動的にキャストでき、すべて問題ありません。しかし、私にはできないので、式を使用するか、考えられるすべての型と値のキャストを提供するコード生成が残っていると思います!

だから表現!

式を作成する場合、オブジェクトを正しい型にアンボックスする必要がありますが (簡単です)、数値型をいずれかのオペランドの最大値に昇格させる必要があります。プロモーションのルールは、C# 仕様に記載されています。

私の質問は、フレームワークに事前に作成されたプロモーション コードがあるかどうか、またはこれについて間違った方法で行っているかどうかです。

助けてくれてありがとう。

アップデート

答えてくれてありがとう。IComparable を使用することを考えていなかったことを認めなければなりません。なぜなら、このメソッドは数値以外にも使用されるからです (明示的には言及していませんが)。そうは言っても、両方のオブジェクトがインターフェイスを実装しているかどうかを確認し、実装している場合はそれを使用することができます。

4

2 に答える 2

3

ジェネリックを使用して、 where T : IComparable を使用する場合、オブジェクト (値) で比較メソッドを使用できます。

static bool IsLessThan<T>(T a, T b) where T : IComparable
{
  return a.CompareTo(b) < 0;
}

2 つの異なるタイプの場合:

static bool IsLessThan<T, V>(T a, V b) where T : IComparable where V : IComparable
{
  return a.CompareTo(b) < 0;
}

値の型 int、long などに注意してください。すでに IComparable になっています。:)

于 2012-04-19T19:08:48.810 に答える
0

最善の方法は、おそらくジェネリックを使用し (まだ使用していない場合)、ジェネリック型を を実装する型に制約してからIComparable、そのCompareToメソッドを使用することです。

于 2012-04-19T19:10:05.767 に答える