基于 属性 基数 class 的派生类型
Derived Type based on a property of base class
我有一个基础 class 和一些派生的 classes:
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
问题是,我有一个基 class 并且可以实例化基 class,但是根据 typeId,我想强制一个特定的 class。假设,在 A 的构造函数中,如果 typeId = 0 接受基数 class,否则抛出。如果 typeId = 1 强制为 class B 否则抛出;这是一个好方法吗?我想要这个是因为类型来自数据库,所以我可以基于它创建正确的实例(当然这将通过 if 语句完成)但我想确保代码执行该业务规则。我是以一种好的方式接近这个吗?或者我该怎么做。
我在 EF Core 中使用 C#(可以在模型配置中设置此规则吗????)
编辑:
Category(categoryId, category)
Item (id, name, categoryId, etc)
Weapon (itemId, dmg, maxenhancelevel, etc)
因此,根据退回商品的类别,我创建了派生 class 或基础 class(取决于)。
找到有关如何使用 EF Core 进行映射的答案:https://weblogs.thinktecture.com/pawel/2018/05/entity-framework-core-inheritance-tpt-is-not-supported-is-it-part-1-code-first.html
一种方法是将所有 classes 放在一个单独的项目中,并在构造函数上使用 internal
修饰符来强制它们的生成方式:
public class BaseClass
{
internal BaseClass() { }
}
public class Class1:BaseClass
{
internal Class1() : base() { }
}
public class Class2 : BaseClass
{
internal Class2() : base() { }
}
然后,在同一项目中创建静态工厂方法 return 正确的 class:
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
,您可以防止从项目外部创建这些 classes。
我有一个基础 class 和一些派生的 classes:
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
问题是,我有一个基 class 并且可以实例化基 class,但是根据 typeId,我想强制一个特定的 class。假设,在 A 的构造函数中,如果 typeId = 0 接受基数 class,否则抛出。如果 typeId = 1 强制为 class B 否则抛出;这是一个好方法吗?我想要这个是因为类型来自数据库,所以我可以基于它创建正确的实例(当然这将通过 if 语句完成)但我想确保代码执行该业务规则。我是以一种好的方式接近这个吗?或者我该怎么做。 我在 EF Core 中使用 C#(可以在模型配置中设置此规则吗????)
编辑:
Category(categoryId, category)
Item (id, name, categoryId, etc)
Weapon (itemId, dmg, maxenhancelevel, etc)
因此,根据退回商品的类别,我创建了派生 class 或基础 class(取决于)。
找到有关如何使用 EF Core 进行映射的答案:https://weblogs.thinktecture.com/pawel/2018/05/entity-framework-core-inheritance-tpt-is-not-supported-is-it-part-1-code-first.html
一种方法是将所有 classes 放在一个单独的项目中,并在构造函数上使用 internal
修饰符来强制它们的生成方式:
public class BaseClass
{
internal BaseClass() { }
}
public class Class1:BaseClass
{
internal Class1() : base() { }
}
public class Class2 : BaseClass
{
internal Class2() : base() { }
}
然后,在同一项目中创建静态工厂方法 return 正确的 class:
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
,您可以防止从项目外部创建这些 classes。