可能重复:
C# - Is there a better alternative than this to 'switch on type'?
C#不支持对象类型的切换。
模拟这种情况的最佳模式是什么:
switch (typeof(MyObj))
case Type1:
case Type2:
case Type3:
发布于 2010-12-18 22:51:50
请参阅 ;此功能现已存在于C#中
我通常使用类型和委托的字典。
var @switch = new Dictionary<Type, Action> {
{ typeof(Type1), () => ... },
{ typeof(Type2), () => ... },
{ typeof(Type3), () => ... },
};
@switch[typeof(MyType)]();
它有点不太灵活,因为你不能通过案例,继续等等。但我很少这样做。
发布于 2010-12-18 22:39:28
更新:在带有pattern matching的C# 7.0中修复了这个问题
switch (MyObj)
case Type1 t1:
case Type2 t2:
case Type3 t3:
老生常谈:
这是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
等。
发布于 2011-09-05 04:29:08
有一个a simple answer to this question,它使用类型字典来查找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");
在模式匹配(类型和运行时检查条件)方面也有a generalized solution to this problem:
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));
}
https://stackoverflow.com/questions/4478464
复制相似问题