2012-04-22 3 views
3

ジェネリック型にNULL可能 を変換しますので、このメソッドは常に戻りラインで例外を上昇 この方法想定

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

答えはありませんが、なぜ条件付きですか。 .ItTrue = Request.QueryString.GetValues(ParamName).FirstOrDefault()== "1" ' – JohnFx

+0

@JohnFx:戻り値がnullの可能性がある第3の状態があります。 '!=" 1 "'は必ずしも '==" 0 "'を意味しません。 –

答えて

8

あなたは私も全くこの種のコードを使用することはありません

return (T)(object)istrue; 

を使用することができます。各データ型を具体的に解析するメソッドを作成するだけです(例:bool? GetBooleanParameter(string name))。あなたはここでジェネリックスを手に入れているわけではなく、コードをもっと煩雑にしています。

3

私ははいBoolean?

を使用しますが、ChangeTypeはそれを見て前に、あなたが無意識のうちにBooleanに変換しているBooleanを使用していない問題がどこにあるか私は理解していません。

最初のパラメータの型はObjectです。 null可能な値の型(この場合はbool?)がobjectに変換されると、null、またはnullを許可しない型のインスタンスが取得されます。したがって、ChangeTypeが見ると、もはやnullableブール値ではありません。

実際の問題は、Converterはnull許容型をサポートしていないことです。特殊な場合は、型がT?の場合は、パラメータがnullか空の文字列かどうかを確認し、空の場合はnullを返し、そうでない場合はTに変換してください。または、Converterを使用するのが最善の方法ではありません。

+0

私は訂正しました:) –

+0

@ShaunRowanラッキーです。 ;) – Saeid

関連する問題