【问题标题】:Return different object types in case statement?在case语句中返回不同的对象类型?
【发布时间】:2019-04-25 12:50:18
【问题描述】:

如何在我的 case 语句中返回不同的对象类型?

    public object?? CreateObjectType(JToken token)
    {
        switch (token["type"].Value<string>())
        {
            case "Car":
                var Car = new Car();
                return car;

            case "Boat":
                var boat = new Boat();
                return boat;
            ..... 
        }
    }

我需要创建一个抽象/接口类来完成这个吗?一个很好的例子。

【问题讨论】:

  • 您不能定义一个您从中派生的通用基本类型(例如Vehicle)并返回它吗?
  • 是的,这基本上是多态性。可能类似于 IVehicle 的东西
  • 你可能需要在这里创建一个泛型。
  • 这么想,对这个不太熟悉。我会读进去的。

标签: c# json object json.net


【解决方案1】:

解决这个问题的最简单方法是使用接口(在我看来):

using System;

namespace Test
{
    public class Test
    {
        public IVehicle CreateObjectType(JToken token)
        {
            switch(token["type"].Value<string>())
            {
                case "Car":
                    return new Car();

                case "Boat":
                    return new Boat();

                default:
                    throw new NotImplementedException();
            }
        }
    }

    public class Boat : IVehicle { }

    public class Car : IVehicle { }

    public interface IVehicle { }
}

或者,您可以使用某种形式的继承链并使用泛型。

补充:Documentation on Interfaces

【讨论】:

  • 非常感谢,我会更多地阅读接口。请问我有一个已经创建 Car 并填充必要属性的方法。我是否只是调用该方法并返回它,例如案例“汽车”:var Car = CreateMyCar();还车;这会完全一样吗?由于方法返回对象类型
  • @Mask-dCodex 是的,你也可以只返回方法调用:return CreateMyCar();
  • @Mask-dCodex 如果我的回答解决了你的问题,请用✓标记它
【解决方案2】:

看起来你正在实现一个基本的factory method pattern

public interface IVehicle {}

public class Car : IVehicle {}
public class Boat : IVehicle {}

public IVehicle CreateObjectType(JToken token)
{
    switch (token["type"].Value<string>())
    {
        case "Car":
            return new Car();
        case "Boat":
            return new Boat();
        default:
          throw new ArgumentOutOfRangeException(nameof(token));
    }
}

【讨论】:

    【解决方案3】:

    你可以这样做: public IVehicle CreateObjectType(JToken token) 或者 public dynamic CreateObjectType(JToken token).

    记住几乎所有dymanic 都需要更多时间来运行和编译。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-10-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-09
      • 2020-11-14
      • 1970-01-01
      相关资源
      最近更新 更多