我有一个A类并继承了B. 假设A类具有以下属性:
类似的东西:
public class ObjectA
{
public int propertyA1 { get; set; }
public int propertyA2 { get; set; }
public int propertyA3 { get; set; }
}
所以我们的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个属性 如果可能的话,前进的方向是什么?
答案 0 :(得分:5)
也许这个:
var b = new ObjectB();
var a = b as ObjectA;
更紧凑的版本:
ObjectA a = new ObjectB();
答案 1 :(得分:3)
答案 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
}
}
}