将Nullable<Boolean>转换为通用类型

4

Assume this method:

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

那么,您对此有什么想法?

不是答案,只是问为什么要有条件语句。只需执行 isTrue=Request.QueryString.GetValues(ParamName).FirstOrDefault() == "1" - JohnFx
@JohnFx:存在第三种状态,其中返回值可能为空。!=“1”并不一定意味着==“0” - Dan Puzey
2个回答

8
您可以使用

标签


return (T)(object)istrue;

我不会使用这种代码。只需创建一个专门解析每种数据类型的方法(例如:bool? GetBooleanParameter(string name))。在这里使用泛型并没有什么好处,只会使代码更加繁琐。


如果T是bool而不是Boolean,这个方法还适用/工作吗? - ryanwebjackson
我正在测试它,它产生了相同的结果。 - ryanwebjackson

3
我不明白问题出在哪里,我没有使用Boolean而是用的Boolean?
是的,但你在ChangeType看到它之前无意中将其转换为Boolean
第一个参数的类型是Object。当可空值类型(在本例中为bool?)转换为object时,您要么得到null,要么得到非可空类型的实例。因此,当ChangeType看到它时,它不再是可空布尔值。
真正的问题是Converter不支持可空类型。最好的情况是,如果类型是T?,则特殊处理,检查参数是否为null或空字符串,如果是,则返回null,否则转换为T。或者在不适合使用Converter的情况下不要使用它。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接