2017-04-25 10 views
6

これは本当に簡単な感じですが、これを動作させる方法が見当たりません。タイプ変数の切り替え

Type propType = propertyInfo.PropertyType; 
switch (propType) 
{ 
    case typeof(byte): // Can't do this, 'A constant value is expected' 
    // Do something 
    break; 
} 

私はまたその上

private const byteType = typeof(byte); 

と切り替えを行ってみましたが、このコード行は、同じ理由でコンパイルに失敗しました。

質問:Typeのインスタンスをどのように切り替えるのですか?

+0

if/elseを使用したくない理由はありますか? – Orangesandlemons

+0

質問には問題はありますか? @Orangesandlemons –

+2

それは私が現時点でやっていることですが、もしあなたが約12人いるなら、あなたはこれがスイッチでなければならないかもしれないと考え始めます。 – Flynn1179

答えて

3

私の最初の答えは間違っていました。あなたはタイプスイッチでそれをすることはできません(私の意見ではこの使用のためにひどいですwhenを指摘していない)。問題はTypeが定数ではないため、スイッチでその値を使用できないことです。

実際の値ではなく、Typeのインスタンスを使用していたと誤解されました。あなたはifステートメントを使用し続ける必要があります。あなたはあなただけvarパターンとwhenガードを使用する必要があり、switchでこれを行うことができます

+0

残念ながら、これは動作しません。 'Type型の式はバイト型のパターンでは処理できません。'というコンパイラは失敗します。 – Flynn1179

+0

@ Flynn1179あなたは正しいです、私の悪いです。 –

+0

これはうまくいきましたが、これはうまくいきました。しかし、 'case type t where t == typeof(byte)'ですが、実際に何十種類もの本当のメリットはありません。 elseステートメント – Flynn1179

2

Type propType = propertyInfo.PropertyType; 
switch (propType) 
{ 
    case var b when b == typeof(byte): 
     // Do something 
     break; 
} 
0

あなたがTypeswitchを使用して設定されている場合、私はあなたがいくつかの選択肢を持っていると思う、両方かなり貧弱。

最初のオプションは、例えば、TypeCodeを使用することです。:

switch (Type.GetTypeCode(propType)) 
{ 
    case TypeCode.Byte: 
    // Do something 
    break; 
} 

それはthe TypeCode enumにある少数のビルトインタイプをサポートしていますので、このアプローチは、厳しく制限されています。

別のオプションは、タイプ名に切り替えることです:

switch (propType.FullName) 
{ 
    case "System.Byte": 
    // Do something 
    break; 
} 

これは、どちらかの素晴らしいではありません、あなたが名前空間を含む完全な名前を記述する必要があるため、名前はタイプミスや、switchのためにチェックされていないでしょうも「偽」System.Byteタイプ(つまり、.Netに含まれていないカスタムタイプSystem.Byte)を受け入れます。

+1

@downvoterあなたはこの答えに間違っていると思いますか? – svick

関連する問題