将Nullable <boolean>转换为Generic type </boolean>

时间:2012-04-22 07:57:52

标签: c# generics exception c#-4.0 nullable

假设这种方法:

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");

那你对此有什么看法?

2 个答案:

答案 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,这不是最佳方式。