首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >C#开关类型

C#开关类型
EN

Stack Overflow用户
提问于 2010-12-18 22:32:34
回答 5查看 251.5K关注 0票数 226

可能重复:

C# - Is there a better alternative than this to 'switch on type'?

C#不支持对象类型的切换。

模拟这种情况的最佳模式是什么:

代码语言:javascript
复制
switch (typeof(MyObj))
    case Type1:
    case Type2:
    case Type3:
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2010-12-18 22:51:50

请参阅 ;此功能现已存在于C#

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

代码语言:javascript
复制
var @switch = new Dictionary<Type, Action> {
    { typeof(Type1), () => ... },
    { typeof(Type2), () => ... },
    { typeof(Type3), () => ... },
};

@switch[typeof(MyType)]();

它有点不太灵活,因为你不能通过案例,继续等等。但我很少这样做。

票数 222
EN

Stack Overflow用户

发布于 2010-12-18 22:39:28

更新:在带有pattern matching的C# 7.0中修复了这个问题

代码语言:javascript
复制
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

否则,这些思路可能会有所帮助。

代码语言:javascript
复制
// nasty..
switch(MyObj.GetType().ToString()){
  case "Type1": etc
}

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

等。

票数 199
EN

Stack Overflow用户

发布于 2011-09-05 04:29:08

有一个a simple answer to this question,它使用类型字典来查找lambda函数。下面是它的用法:

代码语言:javascript
复制
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

代码语言:javascript
复制
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));
}
票数 29
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4478464

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档