C#开启类型

Ada*_*dam 163 c#

可能重复:
C# - "开启类型"有比这更好的选择吗?

C#不支持切换对象的类型.模拟这个的最佳模式是什么:

switch (typeof(MyObj))
    case Type1:
    case Type2:
    case Type3:
Run Code Online (Sandbox Code Playgroud)

谢谢!

Mar*_*k H 181

我通常使用类型和代表的字典.

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

@switch[typeof(MyType)]();
Run Code Online (Sandbox Code Playgroud)

它不太灵活,因为你无法通过案件,继续等等.但我很少这样做.

  • 您应该检查该类型是否在字典中.可以这么简单,比如这个`if(@ switch.ContainsKey(typeof(MyType)))@ switch [typeof(MyType)](); ` (8认同)
  • 我宁愿使用`Action动作; if(@ switch.TryGetValue(typeof(Type1),out action)action();`而不是搜索两次..(包含&indexers) (4认同)
  • 这应该是一个非常有效/高效的解决方案.请注意,这不适用于子类. (3认同)
  • 如果你想要一个适用于子类型的解决方案,那么在某些时候必须使用`IsAssignableFrom`来进行比较.[这个答案支持子类型](http://stackoverflow.com/a/299120/787757)但它的用法有点冗长 (3认同)

gjv*_*amp 59

这是C#游戏中的漏洞,还没有银弹.

你应该谷歌'访客模式',但它可能有点沉重,但你仍然应该知道的事情.

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

否则沿着这些方向的东西会有所帮助

switch (MyObj)
    case Type1 t1: 
    case Type2 t2:
    case Type3 t3:
Run Code Online (Sandbox Code Playgroud)

等等

  • 这并没有回答这个问题。问题是关于打开类型,而不是关于打开对象的类型。 (5认同)
  • 抱歉,“ToString”似乎是一个糟糕的计划 - 因为使用 Visual Studio 重命名类型会破坏这一点。为什么不是`typeOf(Type1)`。 (2认同)
  • 代码示例从字面上切换 MyObj 的类型。 (2认同)
  • 您能否更新此内容以展示如何打开实际的“Type”实例?拥有类似 `switch (typeInstance) { case int: { ... } }` 的内容 (2认同)

cdi*_*ins 25

在类型为c#的Switch case中有一个简单的答案,它使用类型字典来查找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");
Run Code Online (Sandbox Code Playgroud)

开关/模式匹配思想的模式匹配(类型和运行时检查条件)方面,还有一个通用的解决方案.

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));
}
Run Code Online (Sandbox Code Playgroud)


归档时间:

查看次数:

166586 次

最近记录:

6 年,1 月 前