如何实现类型切换

时间:2013-08-02 12:23:45

标签: c#

如果变量的数据类型与某个基本类型匹配,我有一些需要执行的代码片段。目前我正在使用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 If是非常笨拙的。 由于C#不允许类型切换,有没有其他方法可以做到这一点?

4 个答案:

答案 0 :(得分: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)
{
    ...
}

修改
通过使用 dynamic 关键字(.NET 4),它以这种方式工作(完整的控制台应用):

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");
        }
    }
}

答案 1 :(得分:2)

您可以创建Dictionary<Type, Action<object>>并存储类型(从a的{​​{3}}返回值以及执行您希望为给定类型运行的代码的代理。< / p>

例如,看看这个:

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投射到相应的类型。

编辑:正确GetType method注意到,如果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);
}

如果您需要涵盖泛型类型和/或接口,这也是可行的,但代码将变得越来越复杂。

答案 2 :(得分: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;
}

答案 3 :(得分:0)

您应该将类​​型转换为字符串。

 var typeObj = //Value...

        switch (typeObj.GetType().ToString())
        {
            case "System.Int32":
                //Some Code
            case "System.String":
                //Some Code
            default:
                break;
        }