如何让这个函数可靠地将sourceValue转换为类型T,其中sourceValue是bool而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; }
目前,当尝试将false转换为0并将true转换为1时,会抛出InvalidCastException。类型未预定义,这就是必须在此处使用泛型的原因。但是,唯一失败的情况是T:Int32和sourceValue:Boolean。
答案 0 :(得分:4)
假为= 0且真= 1?也许在其他语言中,但这里的演员阵容毫无意义。如果你真的需要这个,我认为这是一个特例。
答案 1 :(得分:2)
我认为将bool转换为int是未定义的。但是,我不认为在你的函数中明确地写出这个特殊情况是合适的,否则你的函数与.NET隐式处理int和bool的方式不一致。
你最好写作:
int value = someFlag ? 1 : 0;
答案 2 :(得分:1)
不完全确定您要执行的操作,但.net确实支持将bool
转换为int
:
Convert.ToInt32(true);
它还可以使用object
,并确定它是否为bool
另见:Convert.ToInt32(bool),
Convert.ToInt32(Object)
答案 3 :(得分: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; }
答案 4 :(得分: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;
}
}