2012-11-28 73 views
3

我有一個通用的方法來生成最小和最大內的隨機數。我也有類似的功能來生成具有相同限制的越界值。如何確定通用數字參數是否未簽名?

但事情是,我需要填寫不同類型的變量。一些變量是無符號的,最小 - 最大範圍與它們的無符號類型相同。

當我嘗試爲這些變量創建越界值時,我超過了變量的限制(確切地說,ushort)。

這是我的泛型方法:

private static U GenerateOutOfBounds<U>(U minimum, U maximum) where U : IComparable, IFormattable, IConvertible 
    { 
     bool b  = g.NextBoolean(); 
     long signCheckForMinimum = Convert.ToInt64(minimum); 
     double maxpp = g.NextDouble(Convert.ToDouble(maximum), Convert.ToDouble(maximum) + g.Next()); 
     double minpp = g.NextDouble(Convert.ToDouble(maximum), Convert.ToDouble(maximum) + g.Next()); 
     if (signCheckForMinimum >= 0) 
     { 
      b = true; 
     } 

     if (b) 
     { 
      return (U)Convert.ChangeType(maxpp, Type.GetTypeCode(typeof(U))); 
     } 
     else 
     { 
      return (U)Convert.ChangeType(minpp, Type.GetTypeCode(typeof(U))); 
     } 
    } 

我試圖確定,如果數字是無符號用它鑄造於長,但現在我可以看到,方法是非常假的。

那麼如何確定我得到的變量是無符號的,還是有任何方法檢查類型是否未經簽名而不與所有無符號類型進行比較?

+2

我會這樣做的主要方式是在'GetTypeCode'(你已經使用過)上做'switch',但坦率地說:特定於類型的重載(而不是通用方法)會更直接。 –

+0

我想我會去那個。至少這是一個更優雅的解決方案。 – theaob

回答

6
bool signed = Convert.ToBoolean(typeof(U).GetField("MinValue").GetValue(null)); 

簽名類型有非零常數MinValue,這將布爾鑄造過程中轉換成true

0

我會通過比較param == abs(param)來回答這個問題,以便您可以確定它是否爲負數並分別處理它。您可以嘗試上轉換爲雙倍(或最大可能的有符號數字類型,以免失去任何精度)。

+0

我可以通過檢查最小限制是否爲負,但它無助於確定參數的類型是否未簽名。 – theaob

相關問題