我有一个具有许多属性的对象(A)。我创建了一个新对象B,它使用一些新属性扩展了对象A.
然后我有一个方法AA返回对象A的实例,但在我当前的方法BB中,我使用了对象B的新实例。
我有没有办法在对象B中使用AA方法的返回?如何分配给B避免按属性复制属性?
class A
{
string a1 {get; set;}
// ...
string a50 {get; set;}
}
class B: A
{
string bState {get; set;}
string bMessage {get; set;}
}
class ObjAA
{
public static AA ReturnAA()
{
AA oAA = new AA();
//...
return oAA;
}
}
class ObjBB
{
public void UseBB()
{
BB oBB = new BB();
var aa = ObjAA.ReturnAA();
// How do I assign to B avoiding property by property?
}
}
感谢
答案 0 :(得分:2)
像AutoMapper这样的工具可以帮助在类似对象类型之间进行此类切换。
答案 1 :(得分:2)
Marc Gravell mentions单程,这很好。
另一种方法是让方法为您返回B
的实例。怎么样?使用泛型。
class ObjAA {
public static T ReturnA<T>() where T : A, new() {
T oAA = new T();
// fill the properties of A
return oAA;
}
}
然后:
class ObjBB
{
public void UseBB()
{
var bb = ObjAA.ReturnA<B>();
// bb is a B, and the properties it inherits from A are filled
}
}
答案 2 :(得分:2)
这是一种将基础对象属性复制到扩展基础的对象的方法。
当我需要使用基类型作为派生类型时,我在那些不幸的场合使用以下代码。是的,它违反了Liskov替代原则(LSP),是的,大多数时候我们赞成合成而不是继承。支持Markus Knappen Johansson,其原始答案基于此。
基类中的代码:
public T As<T>()
{
var type = typeof(T);
var instance = Activator.CreateInstance(type);
if (type.BaseType != null)
{
var properties = type.BaseType.GetProperties();
foreach (var property in properties)
if (property.CanWrite)
property.SetValue(instance, property.GetValue(this, null), null);
}
return (T) instance;
}
允许:
derivedObject = baseObect.As<derivedType>()
由于它使用反射,因此它“昂贵”。相应地使用。