假设这种方法:
public T GetParameterValue<T>(string ParamName) {
if(typeof(T) == typeof(Boolean?) && Request.QueryString.AllKeys.Contains(ParamName)) {
Boolean? istrue = null;
if(Request.QueryString.GetValues(ParamName).FirstOrDefault() == "1")
istrue = true;
else if(Request.QueryString.GetValues(ParamName).FirstOrDefault() == "0")
istrue = false;
return (T)Convert.ChangeType(istrue, typeof(T));
}
//Other types implementation
}
所以这个方法总是在返回行中引发异常:
Invalid cast from 'System.Boolean' to 'System.Nullable`1[[System.Boolean,
mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]'.
我不明白我不使用的问题在哪里Boolean
我使用Boolean?
这是我的电话:
Product.IsAllow= GetParameterValue<Boolean?>("IsAllow");
那你对此有什么看法?
答案 0 :(得分:8)
您可以使用
return (T)(object)istrue;
我根本不会使用这种代码。只需创建一个专门解析每种数据类型的方法(例如bool? GetBooleanParameter(string name)
)。你没有在这里使用泛型,只是让代码更麻烦。
答案 1 :(得分:3)
我不明白我不使用的问题在哪里
Boolean
我使用Boolean?
是的,但在Boolean
看到它之前,您却在不知不觉中将其转换为ChangeType
。
第一个参数的类型为Object
。当可以为空的值类型(在本例中为bool?
)转换为object
时,您将获得null
或非可空类型的实例。因此,当ChangeType
看到它时,它不再是可以为空的布尔值。
真正的问题是Converter
只是不支持可空类型。最好的情况是,特殊情况下,如果类型为T?
,请检查参数是否为空或字符串为空,如果是,则返回null,否则,转换为T
。或者不要使用Converter
,这不是最佳方式。