c#在属性getter / setter中解析和类型转换

时间:2017-05-30 07:52:33

标签: c# inheritance getter-setter

我一直在不断修改我的代码,以便我使用实体框架处理单个表db结构的继承。通过单个表,我的意思是核心对象的每个属性都有一列,所有继承的属性都存储为名为params的列中的json对象。该对象将代表DB结构。

public class Parent
{
    public string Name {get; set;}
    public DateTime Created {get; set;}
    protected ExpandoObject Params {get; set;}
    public TypeEnum Type {get; set;}
}

我从数据库中提取1个父级,但我不知道它的类型。我需要先将它解析为Parent对象,然后读取Type属性以确定它是什么。从这里我可以将其转换为正确的类型。我已经尝试了很多方法来处理这个问题,我认为我已经提出了最简洁的方法,但它导致必须在getter中进行一些解析和数据转换。这是一个例子。

public class Child : Parent
{
    public int ChildID{
        get {
            return Convert.ToInt32(this.Params.ChildID);
        }
        set {
            this.Params.ChildID = value;
        }
    }

    public SomeEnum SomeOtherType{
        get {
            return (SomeEnum)Convert.ToInt32(this.Params.SomeOtherType);
        }
        set {
            this.Params.SomeOtherType = value;
        }
    }
}

这对我来说非常干净,因为它隐藏了实现的复杂性,同时也允许我轻松地将Child转换为Parent而不会丢失数据。我看到的问题是整数被存储为长整数,我需要将它们转换为int(它永远不需要很长)。对于枚举,它也是如此。这种数据处理在对象的getter中是否可以接受?我在这里看到的主要缺点是每次调用属性时都需要完成解析,但它并不太昂贵。如果这是一个可怕的做法,我该怎么做呢?

我已经考虑过的替代方案是

  1. 使用方法加载/保存属性 - 我不想在已经很复杂的设置中添加执行顺序。
  2. 每种类型的表 - 这不会起作用,因为它会使我的所有数据库查询加倍,因为我不知道查询时间的对象类型,因此无法在查询时查询类型表以获取该数据。
  3. 全新的对象 - 无法执行此操作,因为我需要保持对象相关,以便实体可以将类型为Parent的对象保存回数据库

0 个答案:

没有答案