我有5个不同的类都继承自BaseEntity。我想创建一个新的模型类,它将存储这5个类中的一个以及其他标识符所需的信息。
当我从数据库中检索这个新模型的数据时,我得到的只是一个带有类类型的字符串以及一个整数,表示我可以从数据库中引用哪个条目。
例如,如果我检索Id = 2,则Type =“BaseBall”。这意味着我将需要使用我的BaseBallService来获取Id == 2的条目。如果它恰好是Id = 2,Type =“BasketBall”,那么我将使用BasketBallService。
目前我能想到的唯一解决方案就是有一堆if语句来评估'type'字符串。根据类型是否匹配有效类型(BaseBall,FootBall,BasketBall等),将返回该对象。
有没有办法轻松做到这一点,而无需在模型定义中定义所有5种类型,并使用if或语句来识别它?
我希望我已经清楚地确定了问题。如果需要任何其他信息,请与我们联系。我还没有为此编写任何代码。我只是试图分析问题并形成一个解决方案。
答案 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();
}
}