質問

可能な重複:
C#がありまよこは"スイッチタイプ'?

したい場合 switch タイプのオブジェクトには、どうするのがベストなのだ。

コードスニペット

private int GetNodeType(NodeDTO node)
{
    switch (node.GetType())
    { 
        case typeof(CasusNodeDTO):
            return 1;
        case typeof(BucketNodeDTO):
            return 3;
        case typeof(BranchNodeDTO):
            return 0;
        case typeof(LeafNodeDTO):
            return 2;
        default:
            return -1;
    }
}

しか動作しないことにはついてお聞かせください。解消できるのか。は if/else 決適切かるでしょうか?

ご利用のスイッチの追加 .ToString() のです。

役に立ちましたか?

解決

本当にswitch のオプションをチェックすると、オブジェクトも、今までの利用 .ToString().しかし、動きが出始めている全てのコスト: IDictionary<Type, int> まいり お客様 が失わせないアイテムもまだまだ完全に微細な解決策です。

他のヒント

こんに直接解決問題として切り替えたいが自分のユーザ定義型のものですが、他の人みたいにスイッチ内蔵型で利用できます TypeCode 列挙:

switch (Type.GetTypeCode(node.GetType()))
{
    case TypeCode.Decimal:
        // Handle Decimal
        break;

    case TypeCode.Int32:
        // Handle Int32
        break;
     ...
}

にMSDNのブログ 多くの質問:スイッチタイプ は、一部の情報がなぜ .当期純 提供いたしませんスイッチです。

通常通り-回避策は常に存在します。

このどうが、残念ながら紛失してしまいましたが、どうします。こン/オフを切り替え型可能ですが、私個人の考えかくの辞書というより):

  public class Switch
  {
      public Switch(Object o)
      {
          Object = o;
      }

      public Object Object { get; private set; }
  }


  /// <summary>
  /// Extensions, because otherwise casing fails on Switch==null
  /// </summary>
  public static class SwitchExtensions
  {
      public static Switch Case<T>(this Switch s, Action<T> a)
            where T : class
      {
          return Case(s, o => true, a, false);
      }

      public static Switch Case<T>(this Switch s, Action<T> a,
           bool fallThrough) where T : class
      {
          return Case(s, o => true, a, fallThrough);
      }

      public static Switch Case<T>(this Switch s,
          Func<T, bool> c, Action<T> a) where T : class
      {
          return Case(s, c, a, false);
      }

      public static Switch Case<T>(this Switch s,
          Func<T, bool> c, Action<T> a, bool fallThrough) where T : class
      {
          if (s == null)
          {
              return null;
          }

          T t = s.Object as T;
          if (t != null)
          {
              if (c(t))
              {
                  a(t);
                  return fallThrough ? s : null;
              }
          }

          return s;
      }
  }

使用量:

 new Switch(foo)
     .Case<Fizz>
         (action => { doingSomething = FirstMethodCall(); })
     .Case<Buzz>
         (action => { return false; })

くださりを使用します。この場合:

Type nodeType = node.GetType();
if (nodeType == typeof(CasusNodeDTO))
{
}
else ... 

その他の方法です:

if (node is CasusNodeDTO)
{
}
else ...

最初の例であるが、実は正確な種類のみで、後者のチェック継承す。

私に直面し、同じ問題とした。こどものIDictionaryアプローチ:

Dictionary<Type, int> typeDict = new Dictionary<Type, int>
{
    {typeof(int),0},
    {typeof(string),1},
    {typeof(MyClass),2}
};

void Foo(object o)
{
    switch (typeDict[o.GetType()])
    {
        case 0:
            Print("I'm a number.");
            break;
        case 1:
            Print("I'm a text.");
            break;
        case 2:
            Print("I'm classy.");
            break;
        default:
            break;
    }
}

その場合、どちらともいえないさんのファンに甘んじることの番号辞書の記述です。

このなげていくことができれば理想ですが、辞書の参照を殺す:

void FantasyFoo(object o)
{
    switch (typeDict[o.GetType()])
    {
        case typeDict[typeof(int)]:
            Print("I'm a number.");
            break;
        case typeDict[typeof(string)]:
            Print("I'm a text.");
            break;
        case typeDict[typeof(MyClass)]:
            Print("I'm classy.");
            break;
        default:
            break;
    }
}

しおりを付けることがで実施いは見逃?

を実行します。

if (node is CasusNodeDTO)
{
    ...
}
else if (node is BucketNodeDTO)
{
    ...
}
...

ながらたきり優雅で可能な効率的として、その他の回答をこちらです。

を実行します。

function void PrintType(Type t) {
 var t = true;
 new Dictionary<Type, Action>{
   {typeof(bool), () => Console.WriteLine("bool")},
   {typeof(int),  () => Console.WriteLine("int")}
 }[t.GetType()]();
}

で明確で、簡単です。では、以下のキャッシュの辞書のどこか..が多くのコードはこんな物がとにかく..

その際の一つのアプローチでは、純粋な仮想GetNodeType()メソッドをNodeDTO、オーバーライドでの子孫それぞれの子孫を返します実際のタイプです。

のように、スイッチの文書によって、正しい答えは多型.いただけるようにな仮想関数のインターフェース基底クラスおよびオーバーライドのための各ノードタイプです。

私好みのアプローチとして与えられた回答はこちらはありまよこは"スイッチタイプ'?

がしかし話を実施していない任意の型との比較methidsオブジェクト指向言語のようにC#.きの代替としての延長は、追加の必要な機能を継承関係を示します。

この点についてのコメントの著者のブログはこちらhttp://blogs.msdn.com/b/jaredpar/archive/2008/05/16/switching-on-types.aspx#8553535

このことに非常に興味深いポイントが変わったアプローチは同様の状況のみを武器agiは、dexで下がらないboxerぐ。

種類についてもウェイン

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top