是否可以使用主类的属性提取对象?

时间:2016-05-03 17:59:55

标签: c# entity-framework inheritance

我有一个A类并继承了B. 假设A类具有以下属性:

  • propertyA1
  • propertyA2
  • propertyA3

类似的东西:

public class ObjectA
{
    public int propertyA1 { get; set; }
    public int propertyA2 { get; set; }
    public int propertyA3 { get; set; }
}

所以我们的B级将具有以下属性:

  • propertyA1 - 继承A
  • propertyA2 - 继承A
  • propertyA3 - 继承A
  • propertyB1 - 拥有B
  • propertyB2 - Own B

类似的东西:

public class ObjectB : ObjectA
{
    public int propertyB1 { get; set; }
    public int propertyB2 { get; set; }
}

我们创建了一个B类的新对象,想象我们有一个包含20个相同类型对象的列表。 想象一下,A类的属性是200,而B类100也都对应于数据库中的表。

因此,想要保留B类对象列表中的数据(使用 EntityFramework ),我们希望保存表A中A类的信息。 通常我们会做以下事情:

foreach(var item in ObjectsB)
{
    ObjectA a = new ();
    a.propertyA1 = item.propertyA1;
    ...
    // And so on to put all the corresponding properties.
    db.TableA.add(a);
    db.SaveChanges();
}

这是我的问题所在: 是否可以从B类对象创建A类对象?也就是说,省略了B类的所有属性。 类似的东西:

ObjectA a = b.GetPropertiesFromMasterClass();

如果是这样,我们会避免分配200个属性 如果可能的话,前进的方向是什么?

5 个答案:

答案 0 :(得分:5)

也许这个:

var b = new ObjectB();
var a = b as ObjectA;

更紧凑的版本:

ObjectA a = new ObjectB();

答案 1 :(得分:3)

尝试Automapper:

Mapper.CreateMap<ObjectA, ObjectB>();

更多细节可以找到here

答案 2 :(得分:1)

使用Reflection在foreach循环中分配200个属性:

public class ObjectB : ObjectA
{
    public int propertyB1 { get; set; }
    public int propertyB2 { get; set; }
    // ...

    public ObjectA CreateA()
    {
        Type type = typeof(ObjectA);
        ObjectA result = new ObjectA();

        foreach (PropertyInfo propertyInfo in type.GetProperties())
        {
            if (propertyInfo.CanRead)
            {
                object value = propertyInfo.GetValue(this, null);
                propertyInfo.SetValue(result, value);
            }
        }
        return result;
    }
}

答案 3 :(得分:0)

您是否考虑过在数据库中创建可更新的视图?然后,您可以使用Entity Framework语法更新视图并完成。

答案 4 :(得分:-1)

使用继承,您可以针对A创建B的实例。以下示例显示了对象列表:

 class A
    {
        public string Property1 { get; set; }
        public string Property2 { get; set; }

        public string Property100 { get; set; }

        public string Property200 { get; set; }
    }

    class B : A
    {
        public string PropertyB_1 { get; set; }
        public string PropertyB_2 { get; set; }
    }

    class Program
    {
        static void Main(string[] args)
        {
            List<A> list = new List<A>();
            for (int i = 0; i < 10; i++)
            {
                A a = new B()
                {
                    Property1 = "P1_" + i,
                    Property2 = "P2_" + i,
                    Property100 = "P100_" + i,
                    Property200 = "P200_" + i,
                    PropertyB_1 = "PB_1_" + i,
                    PropertyB_2 = "PB_2_" + i
                };
                list.Add(a);
            }
            //list only contains A data
            foreach (A a in list)
            {
                //save a to database
            }
        }
    }