CSharp - C# switch 类型

可能重复:
C# 有比'switch 类型'更好的选择

C# 不支持对对象类型进行切换。 模拟这个最佳模式是什么?


switch (typeof(MyObj)) case Type1: case Type2: case Type3:

谢谢!

时间:

我通常使用类型和委托字典。


var @switch = new Dictionary <Type, Action> { { typeof(Type1), () =>. . . }, { typeof(Type2), () =>. . . }, { typeof(Type3), () =>. . . },
};

@switch[typeof(MyType)]();

它不会通过'你可以少一些 flexable',继续 等等,但我很少这样做。

switch 上有一个关于类型 C#的简单答案,它使用一个类型字典来查找一个lambda函数。

下面是它的用途


 var ts = new TypeSwitch(). Case((int x) => Console.WriteLine("int")). Case((bool x) => Console.WriteLine("bool")). Case((string x) => Console.WriteLine("string")); ts.Switch(42); ts.Switch(false); ts.Switch("hello"); }

switch/模式匹配的思想,在模式匹配( 。两种类型和运行时检查条件) 方面,还有一个广义解决这个问题


 var getRentPrice = new PatternMatcher <int> (). Case <MotorCycle> (bike => 100 + bike.Cylinders * 10 ). Case <Bicycle> (30). Case <Car> (car => car.EngineType == EngineType.Diesel, car => 220 + car.Doors * 20 ). Case <Car> (car => car.EngineType == EngineType.Gasoline, car => 200 + car.Doors * 20 ). Default(0); var vehicles = new object[] { new Car { EngineType = EngineType.Diesel, Doors = 2 }, new Car { EngineType = EngineType.Diesel, Doors = 4 }, new Car { EngineType = EngineType.Gasoline, Doors = 3 }, new Car { EngineType = EngineType.Gasoline, Doors = 5 }, new Bicycle(), new MotorCycle { Cylinders = 2 }, new MotorCycle { Cylinders = 3 }, }; foreach (var v in vehicles) { Console.WriteLine("Vehicle of type {0} costs {1} to rent", v.GetType(), getRentPrice.Match(v)); }

我曾经用一个方法做过一次,希望能帮助。


string fullName = typeof(MyObj).FullName;

switch (fullName)
{ case"fullName1": case"fullName2": case"fullName3":
}

这是 C# 游戏中的一个洞,没有银 bullit 。

你应该在'访问者模式'上谷歌,但它可能有点重,但仍然有一些你应该知道。

下面是使用Linq的另一个问题: http://community.bartdesmet.net/blogs/bart/archive/2008/03/30/afunctionalctypeswitch. aspx

否则这些线上的东西可以帮助


//nasty..
switch(MyObj.GetType.ToString()){ case"Type1": etc
}

//clumsy...
if myObj is Type1 then
if myObj is Type2 then

等等.

祝你好运

GJ

我在极少数场合使用过这种 switchcase 。 即使如此我也找到了另一种方法来做我想要的。 如果你发现这是实现你所需要的唯一方法,那么我建议你使用@Mark的解决方案。

如果这是一种工厂创建决策过程,那么有更好的方法。 否则,我真的不知道为什么要在类型上使用 switch 。

下面是一个扩展标记的小例子。 我认为这是一种处理类型的好方法:


Dictionary <Type, Action> typeTests;

public ClassCtor()
{ typeTests = new Dictionary <Type, Action> (); typeTests[typeof(int)] = () => DoIntegerStuff(); typeTests[typeof(string)] = () => DoStringStuff(); typeTests[typeof(bool)] = () => DoBooleanStuff();
}

private void DoBooleanStuff()
{//do stuff
}

private void DoStringStuff()
{//do stuff
}

private void DoIntegerStuff()
{//do stuff
}

public Action CheckTypeAction(Type TypeToTest)
{ if (typeTests.Keys.Contains(TypeToTest)) return typeTests[TypeToTest]; return null;//or some other Action delegate
}

...