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です。null 許容値型 (この場合bool?は ) が に変換されると、 または null 非許容型のインスタンスがobject取得されます。nullそのため、それを見る頃ChangeTypeには、もはや nullable ブール値ではありません。

本当の問題は、Converternull 許容型をサポートしていないことです。せいぜい、タイプがT?の場合、パラメータが null または空の文字列であるかどうかを確認し、そうであれば null を返し、そうでない場合は に変換するという特別なケースが可能Tです。またはConverter、最善の方法ではない場所では使用しないでください。

于 2012-04-22T08:24:46.757 に答える