在派生类中以不同方式实现基类枚举

杰森

我的情况:

public class EntityBase
{
    public int ID { get; set; }
    [Required()]
    public string Name { get; set; }
    //And this is what is getting me
    //I want a "Type" enum
}

然后,派生的类将具有不同的枚举,它们将分配给Type。

public class AnimalEntity : EntityBase
{
    //Type would have an 'animal type' value: Land, Sea or Air
    //Implementation code would do something like:
    // myAnimal.Type = AnimalType.Land
}

public class PersonEntity : EntityBase
{
    //Type would have a 'person type' value: Doctor, Lawyer or Engineer
    //Implementation code would do something like:
    // myPerson.Type = PersonType.Lawyer
}

public class MonsterEntity : EntityBase
{
    //Type would have a 'monster type' value: Goblinoid, Undead 
}

所以,最大的问题是我要做什么,对吗?我正在尝试创建一个基础存储库类,该类将返回按类型分组的实体。我所有的实体都会有某种“类型”,我想创建一个通用的“按类型分组”。

public abstract class RepositoryBase<T> : IRepositoryBase<T> where T : EntityBase
{
     //Our common GetAsync, GetByIdAsync, and all our other CRUD

     //And then something like this:
    public IEnumerable<GroupedData<string, T>> GetGroupedByType(string searchTerm)
    {
        var entities =
            from s in DbSet
            where (searchTerm == null || s.Name.ToLower().Contains(searchTerm))
            group s by s.Type into g
            select new GroupedData<string, T> { Key = g.Key.ToString(), Data = g };

        return (entities);
    }
}

当T为AnimalEntity时,我将获得带有相应实体的组Land,Sea和Air。对于PersonEntity,我将获得Doctor,Lawyer,Engineer组。

如果我的方法/设计无效或不理想,请告诉我。

阿德里亚诺·雷佩蒂(Adriano Repetti)

枚举(请原谅)是二等公民,因此您可能想到的第一件事将不起作用

class EntityBase<T> where T : enum {
    public T Type { get; set; }
}

不幸的是,它无法编译,您可能会考虑将其替换enum为基类:

class EntityBase<T> where T : EntityTypeBase {
    public T Type { get; set; }
}

实施所需的EntityTypeBase一切以使其适应(==以及!=操作员,IConvertible界面和其他样板)。这是很多代码,您还需要在EF中进行管理(否则,除非将内存中的所有内容作为对象加载,否则您将无法在查询中使用此类属性)。您也可以强制使用enums(带有运行时检查),但这会中断EF中SQL代码的生成。

在这种情况下,我建议使用EF知道并理解的类型。您可以使用字符串(如果需要)或整数(如本例所示):

class EntityBase
    public virtual int Type { get; set; }
}

在派生类中:

class AnimalEntity : EntityBase {
    public override int Type { 
        get { return base.Type; }
        set {
            if (!Enum.IsDefined(typeof(AnimalType), value))
                throw new ArgumentException();

            base.Type = (int)value;
        }
    }
}

这样,您仍然可以使用PersonType.LayerAnimalType.Land保持一些类型的安全性。当然,您需要使枚举保持同步,以确保没有重复的值(否则group by将不起作用)。

最后,请考虑使用...另一个实体。如果您还有另一个表EntityType

ID名称适用于
0下岗人
1个程序员
2陆生动物
...

在设置器中需要做的是检查类型是否适用,并且可能没有几个方便的类可以按类型对它们进行分组:

public static class PersonType {
    public static EntityType Lawyer { get { ... } }
    public static EntityType Programmer { get { ... } }
}

IMO的伸缩性更好(更容易添加新项目,以后您可以将某些行为委托给EntityType项目),并且比硬编码常量更安全(因为完整性由DB引擎本身授予)。当然,要付出的代价是在EntityType表中进行搜索的额外开销(除非您使用某些缓存机制)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

派生类中不同方法的多态性

来自分类Dev

从派生类中隐藏基类的实现细节

来自分类Dev

覆盖派生类中的枚举值

来自分类Dev

基类不实现INotifyPropertyChange;如何在派生类中实现它?

来自分类Dev

在派生类中实现IDisposable

来自分类Dev

派生类会破坏基类的实现吗

来自分类Dev

在基类中声明的C#接口方法无需在派生类中再次实现

来自分类Dev

C#:在基类中定义方法实现,在派生类中定义属性

来自分类Dev

在基类中声明的C#接口方法无需在派生类中再次实现

来自分类Dev

C#:在基类中定义方法实现,在派生类中定义属性

来自分类Dev

防止在派生类C#中调用基类实现的接口方法

来自分类Dev

尽管不同的参数列表,基类模板成员函数仍在“派生类”中隐藏

来自分类Dev

在C++中将抽象基类的不同派生类的对象存储在数组中

来自分类Dev

重用派生类中的基类中的变量:Scala

来自分类Dev

如何以不同的方式呈现类的派生类型?

来自分类Dev

如何以不同的方式呈现类的派生类型?

来自分类Dev

在C#中的派生类中重写枚举

来自分类Dev

从派生类中引用基类的更好习惯?

来自分类Dev

在派生类中无意基类构造函数“隐藏”

来自分类Dev

返回派生类类型的基类中的方法?

来自分类Dev

在基类中使用派生类中的常量

来自分类Dev

如何从派生类中获取基类实例

来自分类Dev

从派生类访问基类中的受保护成员

来自分类Dev

将派生类存储在基类Dictionary中

来自分类Dev

如何从C ++中的基类访问派生类的属性?

来自分类Dev

Boost.Python中的基类和派生类

来自分类Dev

基类和派生类中的数据成员相同

来自分类Dev

从派生类访问基类中的类型别名

来自分类Dev

Python:在派生类中隐藏基类的成员

Related 相关文章

  1. 1

    派生类中不同方法的多态性

  2. 2

    从派生类中隐藏基类的实现细节

  3. 3

    覆盖派生类中的枚举值

  4. 4

    基类不实现INotifyPropertyChange;如何在派生类中实现它?

  5. 5

    在派生类中实现IDisposable

  6. 6

    派生类会破坏基类的实现吗

  7. 7

    在基类中声明的C#接口方法无需在派生类中再次实现

  8. 8

    C#:在基类中定义方法实现,在派生类中定义属性

  9. 9

    在基类中声明的C#接口方法无需在派生类中再次实现

  10. 10

    C#:在基类中定义方法实现,在派生类中定义属性

  11. 11

    防止在派生类C#中调用基类实现的接口方法

  12. 12

    尽管不同的参数列表,基类模板成员函数仍在“派生类”中隐藏

  13. 13

    在C++中将抽象基类的不同派生类的对象存储在数组中

  14. 14

    重用派生类中的基类中的变量:Scala

  15. 15

    如何以不同的方式呈现类的派生类型?

  16. 16

    如何以不同的方式呈现类的派生类型?

  17. 17

    在C#中的派生类中重写枚举

  18. 18

    从派生类中引用基类的更好习惯?

  19. 19

    在派生类中无意基类构造函数“隐藏”

  20. 20

    返回派生类类型的基类中的方法?

  21. 21

    在基类中使用派生类中的常量

  22. 22

    如何从派生类中获取基类实例

  23. 23

    从派生类访问基类中的受保护成员

  24. 24

    将派生类存储在基类Dictionary中

  25. 25

    如何从C ++中的基类访问派生类的属性?

  26. 26

    Boost.Python中的基类和派生类

  27. 27

    基类和派生类中的数据成员相同

  28. 28

    从派生类访问基类中的类型别名

  29. 29

    Python:在派生类中隐藏基类的成员

热门标签

归档