4

変数のデータ型が特定の基本型と一致する場合に実行する必要がある特定のコード スニペットがあります。現在、if-else ループを使用してこれを行っています。

元:

  if(a is float)
  {
   // do something here
  }
  else if (a is int)
  {
  // do something here
  }
  else if (a is string)
  {
  // do something here
  }

比較しなければならない型が多すぎるため、If else を使用するのは非常に面倒です。C# では型の切り替えが許可されていないため、これを行う別の方法はありますか?

4

4 に答える 4

5

コードをリファクタリングし、メソッドのオーバーロードを使用します。

void SomeCode()
{
    ...
    Action(3.0f); // calls float overload
    Action("hello"); // calls string overload
    ...
}

void Action(float a)
{
    ...
}
void Action(int a)
{
    ...
}
void Action(string a)
{
    ...
}

編集:キーワード (.NET 4)
を使用すると、次のように動作します (完全なコンソール アプリ):dynamic

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            SomeCode();
        }

        static void SomeCode()
        {
            object o = null;
            switch (new Random().Next(0, 3))
            {
                case 0:
                    o = 3.0f;
                    break;
                case 1:
                    o = 3.0d;
                    break;
                case 2:
                    o = "hello";
                    break;
            }
            Action((dynamic)o); // notice dynamic here
        }

        static void Action(dynamic a)
        {
            Console.WriteLine("object");
        }

        static void Action(float a)
        {
            Console.WriteLine("float");
        }
        static void Action(int a)
        {
            Console.WriteLine("int");
        }
        static void Action(string a)
        {
            Console.WriteLine("string");
        }
    }
}
于 2013-08-02T12:28:28.827 に答える
2

型を作成して格納できます(のメソッドからのDictionary<Type, Action<object>>戻り値と、特定の型に対して実行するコードを実行するデリゲートと共に)。GetTypea

たとえば、これを見てください:

private readonly Dictionary<Type, Action<object>> typeActions = new Dictionary<Type, Action<object>>()
{
    { typeof(int), (a) => { Console.WriteLine(a.ToString() + " is an integer!"); } },
    { typeof(float), (a) => { Console.WriteLine(a.ToString() + " is a single-precision floating-point number!"); } }
};

この辞書は、コードの他の場所で使用できます。

Action<object> action;
if (typeActions.TryGetValue(a.GetType(), out action)) {
    action(a);
}

aアクション内で適切な型にキャストする必要があることに注意してください。

編集:クリスが正しく指摘したように、登録されたタイプのサブクラスに属しているa.GetType()かどうかは認識されません。aそれを含める必要がある場合は、型階層をたどる必要があります。

Action<object> action = null;
for (Type t = a.GetType(); t = t.BaseType; t != null) {
    if (typeActions.TryGetValue(t, out action)) {
        break;
    }
}
if (action != null) {
    action(a);
}

ジェネリック型および/またはインターフェイスをカバーする必要がある場合、これも実行可能ですが、コードは着実に複雑になります。

于 2013-08-02T12:36:10.913 に答える
0

タイプを文字列に変換する必要があります。

 var typeObj = //Value...

        switch (typeObj.GetType().ToString())
        {
            case "System.Int32":
                //Some Code
            case "System.String":
                //Some Code
            default:
                break;
        }
于 2013-08-02T12:40:57.850 に答える
0

私の解決策はあなたのものと大差ありませんが、私は次のようにしました:

while(true){
    var typeOfVarToCheck = a.GetType();  // a comes from Op's Code
    if(typeOfVarToCheck==typeof(type1)){
        //Do Something
        break;
    }
    if(typeOfVarToCheck==typeof(type2)){
        //Do Something
        break;
    }
    //Do default
    break;
}
于 2013-08-02T12:28:46.203 に答える