2009-09-11 43 views
0

如何將此函數可靠地將sourceValue轉換爲類型T,其中sourceValue是bool且T是int?cast bool to T其中T是int

 
public static T ConvertTo<T>(Object sourceValue) 
{ 
    // IF IS OF THE SAME TYPE --> RETURN IMMEDIATELY 
    if (sourceValue is T) 
    return (T) sourceValue; 

    var val = ConvertTo(sourceValue, typeof (T)); 
    return (T) val; 
} 

目前,試圖轉換假爲0,真爲1的類型不是預定義的,這就是爲什麼仿製藥必須在這裏使用時,這引發InvalidCastException。但是,唯一失敗的情況是T:Int32和sourceValue:Boolean。

+1

只是好奇,但爲什麼你想使用一個獨立的方法呢?如果'b'是'bool',只要做'int x = b? 1:0;'。 – bcat 2009-09-11 21:21:34

+0

我認爲他正在尋找一個通用的解決方案,但這個「邊緣」案件不適合。 – spender 2009-09-11 21:23:15

+0

也許。我只是看不到通用轉換方法的用例。我並不是說沒有一個有效的,我現在還想不起來。 – bcat 2009-09-11 21:26:31

回答

4

是false = 0且true = 1?也許在其他語言中,但這裏演員沒有意義。如果你真的需要這個,我認爲這是一個特例。

+0

+1如果類型是預定義的,這似乎並不是對泛型的警告。 – 2009-09-11 21:23:59

+1

'Convert.ToInt32'確實如此 - 將false轉換爲0並將其轉換爲1.我想它確實有道理。 – Kobi 2009-09-11 21:46:02

+0

這些類型不是預定義的,這就是爲什麼必須在這裏使用泛型。但是,唯一失敗的情況是T:Int32和sourceValue:Boolean。 – 2009-09-11 22:38:54

2

我會認爲將bool轉換爲int是未定義的。但是,我不認爲它適合在你的函數中明確寫出特例,否則你的函數與.NET隱式地處理int和bools的方式不一致。

你最好寫:

int value = someFlag ? 1 : 0; 
0

我需要一個非常通用的解決方案。這是我能想出的最好:

 
public static T ConvertTo(Object sourceValue) 
    { 
     // IF IS OF THE SAME TYPE --> RETURN IMMEDIATELY 
     if (sourceValue is T) 
     return (T) sourceValue; 

     var val = ConvertTo(sourceValue, typeof (T)); 

     // SPECIAL CASE: Convert bool(sourceValue) to int(T) 
     if (val is bool) 
     { 
     var b = (bool) val; 
     if (b) 
      return (T) (object) 1; // if val is true, return 1 

     return (T) (object) 0; 
     } 

     return (T) val; 
    } 
+1

@Mark:這不會編譯,與您問題中的原始示例相同。這兩個例子都會調用另一個你沒有向我們展示的'ConvertTo'方法的重載。如果你給我們代碼,我們可以實際編譯和測試,那麼我確信有人可以幫忙。 – LukeH 2009-09-11 23:18:14

+0

有人可能會因盧克給出的原因而退下來。我沒有足夠的代表。 – 2014-07-02 09:37:53

+0

@KrisAdams原因? – 2014-07-02 13:30:32

0

作爲後續馬克的自己的答案。我認爲這是一個體面的解決方案:

 protected Nullable<T> ConvertTo<T>(Object sourceValue) where T : struct, IComparable 
    { 
     if (sourceValue is T) 
      return (T)sourceValue; 

     if (sourceValue == null) 
     { 
      return null; 
     } 
     try 
     { 
      var val = Convert.ChangeType(sourceValue, typeof(T)); 
      return (T)val; 
     } 
     catch (FormatException) 
     { 
      return null; 
     } 

    } 
+0

我不再需要解決這個問題,但如果有人可以驗證此代碼編譯,我會將其標記爲答案。 – 2014-07-03 15:30:50

相關問題