2009-09-11 82 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