2012-05-09 11 views
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; 
} 

禮貌我剛纔問的問題How to create a Between Extension Method

但是,如果他們有不同的數據類型,但相同的基類的東西。

我想看看像

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

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

在上面的代碼中我檢查一個int值和雙值之間的字節值。在這種情況下如何做。我想創建一個像

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

+0

在你的例子中寫出* compilable *代碼,當'T1'是'byte','T2'是'int'時,等等。看看這些代碼,並考慮你有什麼希望使其具有通用性。 – AakashM

+0

擴展方法是否應該拼寫爲'IsBetween'?聽起來更好。 –

+0

@FelixK:它的擴展方法裏面的代碼在我的大腦裏聽起來更好。 –

回答

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; 
} 

這將T2T3轉換爲T1,然後對它們進行比較。 如果lowesthighestT1類型轉換失敗,你會(如果T1bytelowerhighest255大爲例)得到一個異常。 所以你可能想檢查T1,如果需要,將actual轉換爲更大的數據類型。

1

如果通過數字類型,這是在CLR的一等公民工作,你不能有合同/接口自然適用於他們。是什麼在我腦海中,是讓所有的人都到大常見的數值類型和比較後,說():

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

使用後它喜歡:

if(a.Between(0,(decimal)8.0)) 
+0

我想你錯過了EM的要點。如果這就是我想要做的,爲什麼它會寫Ext.Met。以及我將如何繼續轉換每種可用的數據類型。 –

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; 
} 

僅在T1上需要IComparable,因爲只有實際(T1的實例)調用CompareTo。

檢查基類約束: - >http://msdn.microsoft.com/en-us/library/d5x73970.aspx

+0

你試過了嗎? T從哪裏來?你知道它的可比性? –

+0

感謝您的指點,我錯過了這一點,並只關注基於派生類型的問題 – Tilak

+1

如果您在約束中使用T,它必須出現在聲明中

0

IComparable的需要被比較的Type相同Type作爲Type被進行比較。因此,您需要具有與actuallowesthighest相同的Type

這意味着做這樣的事情:

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

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

如果嘗試跨類型的比較,你會得到在運行時異常。

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

將導致異常被引發與消息'對象必須是類型Int32。'

+0

我認爲你錯過了點EM。如果這就是我想要做的,爲什麼它會寫Ext.Met。以及我將如何繼續轉換每種可用的數據類型。 –

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.0 ...而不是被捕獲。

不完美,但你會避免噸的「類型檢查」。

相關問題