C#开启types

可能重复:
C# – 有没有比这更好的替代“打开types”?

C#不支持切换对象的types。 什么是模拟这个最好的模式:

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

谢谢!

我通常使用types和代表字典。

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

这是一个不太灵活的,因为你不能通过案件,继续等,但我很less这样做。

在C#types的Switch case上 ,这个问题有一个简单的答案,它使用types的字典来查找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"); } 

在模式匹配(types和运行时间检查条件)方面,在交换/模式匹配思想方面也存在这个问题的广义解决scheme

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

这是C#游戏的一个漏洞,还没有银弹。

你应该谷歌的“访客模式”,但它可能有点沉重,但你仍然应该知道的东西。

下面是使用Linq的另一个问题: http : //community.bartdesmet.net/blogs/bart/archive/2008/03/30/a-functional-c-type-switch.aspx

否则沿着这些线路可能会有所帮助

 // nasty.. switch(MyObj.GetType.ToString()){ case "Type1": etc } // clumsy... if myObj is Type1 then if myObj is Type2 then 

等等

在罕见switch-case ,我已经使用了这种switch-case 。 即使如此,我find了另一种做我想做的事情的方法。 如果你发现这是实现你所需要的唯一方法,我会推荐@Mark H的解决scheme。

如果这是一种工厂创造决策过程,那么有更好的方法去做。 否则,我真的不明白你为什么要使用types的开关。

这是一个扩展Mark的解决scheme的小例子。 我认为这是处理types的好方法:

 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 } 

我做了一个解决方法,希望它有帮助。

 string fullName = typeof(MyObj).FullName; switch (fullName) { case "fullName1": case "fullName2": case "fullName3": }