c#中的继承。复制基础对象中的属性

时间:2011-07-09 20:13:26

标签: c# inheritance

我有一个具有许多属性的对象(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?
   }
}

感谢

3 个答案:

答案 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>()

由于它使用反射,因此它“昂贵”。相应地使用。