2

実行時に値が入力される変数があります。その値が 2 つの異なるデータ型の値 (最低値と最高値など) の間にあるかどうか、または拡張メソッドを使用していないかどうかを確認したいと思います。

これら 2 つの値 (最低値と最高値) は同じデータ型にすることができます (問題ありません)。それからそのような

public static bool Between<T>(this T actual, T lower, T upper) 
    where T : IComparable<T>
{
    return actual.CompareTo(lower) >= 0 && actual.CompareTo(upper) <= 0;
}

私の以前の質問の厚意により、Between Extension メソッドの作成方法

しかし、データ型が異なっていても基本クラスが同じである場合はどうなるでしょうか。

いう

みたいにチェックしたい

byte a = 2; //here static but is can be changed at runtime

if(a.Between(0,8.0))
   DoSomething();
else
   DoNothing();

上記のスニペットでは、int 値と double 値の間のバイト値をチェックしています。そのような場合の対処方法。のような拡張メソッドを作成したい

public static bool Between<T1, T2, T3>(this T1 actual, T2 lowest, T3 highest) 
     where T1: ???? 
     where T2: ????
     where T3: ????
{
     What code to write here???? 
}

上記のスニペットの場合、EM が返されるはずですtrue

4

5 に答える 5

3

試してみたところ、最も近いものはこれでした:

public static bool Between<T1, T2, T3>(this T1 actual, T2 lowest, T3 highest) 
     where T1: IComparable 
     where T2: IConvertible
     where T3: IConvertible
{
     return actual.CompareTo(lowest.ToType(typeof(T1), null)) >= 0 && 
            actual.CompareTo(highest.ToType(typeof(T1), null)) <= 0;
}

T2これはとを に変換T3T1、それらを比較します。lowestorhighestの型への変換がT1失敗した場合、例外が発生します (たとえば、T1isbyteおよびlowerorhighestが より大きい場合255)。したがって、 を確認し、必要に応じてより大きなデータ型にT1変換することをお勧めします。actual

于 2012-05-09T08:36:32.017 に答える
1

CLRの第一級市民である数値型を操作している場合、当然、それらにコントラクト/インターフェースを適用することはできません。私の頭に浮かぶのは、それらすべてをより大きな一般的な数値タイプにして、次のように比較することです(疑似コード):

public static bool Between(this byte actual, decimal lowest)   
{
    ...
}

そしてそれを使用した後:

if(a.Between(0,(decimal)8.0))
于 2012-05-09T08:06:16.587 に答える
1
public static bool Between<T1, T2, T3>(this T1 actual, T2 lowest, T3 highest) 
 where T1: T,  IComparable<T> 
 where T2: T
 where T3: T>
{
 return actual.CompareTo(lower) >= 0 && actual.CompareTo(upper) <= 0;
}

IComparableは、実際の(T1のインスタンス)のみがCompareToを呼び出すため、T1でのみ必要です。

基本クラスの制約を確認します:-> http://msdn.microsoft.com/en-us/library/d5x73970.aspx

于 2012-05-09T08:06:32.693 に答える
0

それほどエレガントではありませんが、数値比較のための特定の方法を実行します

 public static bool BetweenNumeric<T1, T2, T3>(this T1 actual, T2 lowest, T3 highest)
            where T1 : IConvertible
            where T2 : IConvertible
            where T3 : IConvertible
        {
            try
            {
                var actualDouble = Convert.ToDouble(actual);
                var lowestDouble = Convert.ToDouble(lowest);
                var highestDouble = Convert.ToDouble(highest);
                return (actualDouble).CompareTo(lowestDouble) >= 0 && actualDouble.CompareTo(highestDouble) <= 0;
            }
            catch
            {
                return false;
            }
        }

ちなみに、たとえば、型の1つがブール値の場合、キャッチされるのではなく、1.0に変換されます。

完璧ではありませんが、大量の「タイプチェック」を回避できます。

于 2012-05-09T08:14:16.067 に答える
0

IComparable では、比較対象Typeが比較対象と同じであるType必要がありTypeます。したがって、 、および とType同じである必要があります。actuallowesthighest

これは、次のようなことを意味します。

byte a = 2;
decimal toCompare = (decimal)a;

if(toCompare.Between(0.0, 8.0))
{
   DoSomething();
}
else
{
   DoNothing();
}

タイプ間で比較しようとすると、実行時に例外が発生します。

Console.WriteLine(1.CompareTo(2.0));

「オブジェクトは Int32 型である必要があります」というメッセージとともに例外がスローされます。

于 2012-05-09T08:09:03.840 に答える