基于类型返回对象

时间:2013-06-24 16:22:30

标签: c# asp.net-mvc-4

我有5个不同的类都继承自BaseEntity。我想创建一个新的模型类,它将存储这5个类中的一个以及其他标识符所需的信息。

当我从数据库中检索这个新模型的数据时,我得到的只是一个带有类类型的字符串以及一个整数,表示我可以从数据库中引用哪个条目。

例如,如果我检索Id = 2,则Type =“BaseBall”。这意味着我将需要使用我的BaseBallService来获取Id == 2的条目。如果它恰好是Id = 2,Type =“BasketBall”,那么我将使用BasketBallService。

目前我能想到的唯一解决方案就是有一堆if语句来评估'type'字符串。根据类型是否匹配有效类型(BaseBall,FootBall,BasketBall等),将返回该对象。

有没有办法轻松做到这一点,而无需在模型定义中定义所有5种类型,并使用if或语句来识别它?

我希望我已经清楚地确定了问题。如果需要任何其他信息,请与我们联系。我还没有为此编写任何代码。我只是试图分析问题并形成一个解决方案。

2 个答案:

答案 0 :(得分:1)

您可以尝试使用词典,例如

  Dictionary<String, BaseEntry> types = new Dictionary<String, BaseEntry>() {
    {"BaseBall", new BaseBallService()},
    {"BasketBall", new BasketBallService()},
    ...
  }

  ...
  var value = types["BaseBall"].GetId(2);

答案 1 :(得分:1)

我只想在项目或解决方案级别添加一个全局枚举来存储类型。这样,如果您希望稍后添加它,您可以在不破坏任何现有代码的情况下进行分离。但是这可以保持良好的类型,因此需要从最终用户或应用程序列出的类型。我做了一个简单的控制台应用来展示这个。您可以将枚举应用于任何类,而不仅仅是通用类。我还实现了一个返回方法来缩小返回列表,以显示如何更轻松地获取列表列表。

public enum types
    {
        Type1,
        Type2,
        Type3
    }

    public class GenericListing
    {
        public string Description { get; set; }
        public types Type { get; set; }
    }

    class Program
    {
        public static List<GenericListing> GetTypeListing(List<GenericListing> aListings, types aTypes)
        {
            return aListings.Where(x => x.Type == aTypes).ToList();
        }

        static void Main(string[] args)
        {
            var stuff = new List<GenericListing>
                {
                    new GenericListing {Description = "I am number 1", Type = types.Type1},
                    new GenericListing {Description = "I am number 2", Type = types.Type2},
                    new GenericListing {Description = "I am number 3", Type = types.Type3},
                    new GenericListing {Description = "I am number 1 again", Type = types.Type1},
                };


            string s = "";

            GetTypeListing(stuff, types.Type1)  // Get a specific type but require a well typed input.
                .ForEach(n => s += n.Description + "\tType: " + n.Type + Environment.NewLine);

            Console.WriteLine(s);

            Console.ReadLine();
        }
    }