現状の C# コンパイラでは Type like をオンにできないことを理解しています
switch (typeof(MyObj))
case Type1:
case Type2:
case Type3:
タイプとアクションのディクショナリまたは静的クラス (リンク) を使用できるソリューションがありますが、なぜこれが悪い慣行なのか、コンパイラにまだ実装されていないのか、興味があります。
前もって感謝します。
現状の C# コンパイラでは Type like をオンにできないことを理解しています
switch (typeof(MyObj))
case Type1:
case Type2:
case Type3:
タイプとアクションのディクショナリまたは静的クラス (リンク) を使用できるソリューションがありますが、なぜこれが悪い慣行なのか、コンパイラにまだ実装されていないのか、興味があります。
前もって感謝します。
プリミティブ型について話している場合は、 switch over を実行できますTypeCode
。
var typeCode = Type.GetTypeCode(type);
switch (typeCode)
{
case TypeCode.Empty:
break;
case TypeCode.Object:
break;
case TypeCode.DBNull:
break;
case TypeCode.Boolean:
break;
case TypeCode.Char:
break;
case TypeCode.SByte:
break;
case TypeCode.Byte:
break;
case TypeCode.Int16:
break;
case TypeCode.UInt16:
break;
case TypeCode.Int32:
break;
case TypeCode.UInt32:
break;
case TypeCode.Int64:
break;
case TypeCode.UInt64:
break;
case TypeCode.Single:
break;
case TypeCode.Double:
break;
case TypeCode.Decimal:
break;
case TypeCode.DateTime:
break;
case TypeCode.String:
break;
}
ところで、あなたが読む必要があるかもしれないあなたの質問に対する答えは、電球を交換するのに何人のマイクロソフト従業員が必要ですか?
C# の : switch ステートメントと "a constant value is expected"に対する受け入れられた回答を参照してください。コンパイラは、コンパイル時に重複がないことを認識する必要があるため、定数のみを受け入れます。ちなみに、同じ効果を得ることができます
switch (typeof(MyObj).FullName
次のように、各タイプの名前を大文字と小文字の条件として使用します。
case "MyNamespace.Type1":
/*stuff*/
break;
case "MyNamespace.Type2":
/*other stuff*/
break;
default:
/*default stuff*/
いつスイッチオンタイプを使いますか?私が考えることができるほとんどのケースは、次のことを行うよりも、継承を使用して解決する方が適切です。
switch (typeof(MyObj)) {
case Type1: doSomethingForType1; break;
case Type2: doSomethingForType2; break;
case Type3: doSomethingForType3; break;
よりオブジェクト指向の方法で設定します。
Interface ISpecialType {
void doSomething();
}
Type1 : ISpecialType {
doSomething() {}
}
Type2 : ISpecialType {
doSomething() {}
}
Type3 : ISpecialType {
doSomething() {}
}
それから、何があっても呼び出すだけですMyObj.doSomething();
。最初は少しタイピングが増えますが、はるかに堅牢です。
また、オンにすることが本当に重要な場合は、いつでも typeof(MyObj).toString() を使用してオンにすることができます。スイッチに変更できる文字列をハードコーディングしているため、推奨される方法ではありませんが、変更は可能です。