4

假设这个方法:

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

那么您对此有何想法?

4

2 回答 2

8

您可以使用

return (T)(object)istrue;

不过,我根本不会使用这种代码。只需创建一个专门解析每种数据类型的方法(例如bool? GetBooleanParameter(string name))。你在这里的泛型没有任何收获,只会让代码更麻烦。

于 2012-04-22T08:06:43.300 回答
3

我不明白问题在哪里我不使用Boolean我使用Boolean?

是的,但是您在不知不觉中将其转换为Boolean之前ChangeType看到的。

第一个参数有类型Object。当可空值类型(在本例bool?中)转换为 时object,您将获得null或非可空类型的实例。因此,当ChangeType看到它时,它不再是可为空的布尔值。

真正的问题是它Converter不支持可为空的类型。充其量,您可以特殊情况,如果类型为T?,则检查参数是否为 null 或空字符串,如果是,则返回 null,否则,转换为T. 或者不使用Converter它不是最好的方法。

于 2012-04-22T08:24:46.757 回答