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