基于基类属性的派生类型



我有一个基类和几个派生类:

public class Item
{
public (int itemId, string itemName)
{
ItemId = itemId;
ItemName = itemName;
}    
public int ItemId { get; set; }
public string ItemName { get; set; }
}
public class Weapon : Item
{
public Weapon(int itemId, string itemName) : base(itemId, itemName) 
{
if(itemId != 1) throw InvalidObjectType;
}
//custom properties
}
public class Armor : Item
{
public Armor(int itemId, string itemName) : base(itemId, itemName) 
{
if(itemId != 2) throw InvalidObjectType;
}
//custom properties
}
//etc

问题是,我有一个基类,这个基类可以实例化,但根据typeId,我想强制创建一个特定的类。假设在A的构造函数中,如果typeId=0接受基类,则抛出else。如果typeId=1,则强制为B类,否则抛出;这是一个好方法吗?我想要这样做是因为类型来自数据库,所以我可以在此基础上创建正确的实例(当然,这将通过if语句完成(,但我希望确保代码强制执行该业务规则。我是不是以一种好的方式来处理这个问题?或者我该怎么做。我正在使用带有EF Core的C#(这个规则可以在模型配置中设置吗??(

编辑:

Category(categoryId, category)
Item (id, name, categoryId, etc)
Weapon (itemId, dmg, maxenhancelevel, etc)

因此,根据返回项的类别,我创建了一个派生类或基类(dependents(。

关于如何将其与EF Core进行映射,请给出答案:https://weblogs.thinktecture.com/pawel/2018/05/entity-framework-core-inheritance-tpt-is-not-supported-is-it-part-1-code-first.html

一种方法是将所有类放在一个单独的项目中,并在构造函数上使用internal修饰符来强制执行它们的生成方式:

public class BaseClass
{
internal BaseClass() { }
}
public class Class1:BaseClass
{
internal Class1() : base() { }
}
public class Class2 : BaseClass
{
internal Class2() : base() { }
}

然后,在同一个项目中创建一个静态工厂方法来返回正确的类:

public static BaseClass ClassFactory(int typeId)
{
switch(typeId)
{
case 0:
return new BaseClass();
case 1:
return new Class1();
case 2:
return new Class2();
default:
throw new ArgumentException("Unrecoginzed typeId");
}
}

通过使用internal,可以防止从项目外部创建这些类。

相关内容

最新更新