C#中的继承。如何复制基对象中的属性?

3

我有一个具有许多属性的对象(A)。 我创建了一个新对象B,扩展了对象A并添加了一些新属性。

然后我有一个方法AA,它返回对象A的实例,但是在当前的BB方法中,我使用新的对象B的实例。

我是否有任何方法可以使用方法AA的返回结果来分配给对象B? 如何指定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?
   }
}

thanks


@阿瓦达·凯达拉。谢谢,我已经更正了这个例子。 - andres descalzo
3个回答

2
Marc Gravell提到了一种方法,这很好。另一种方法是让方法直接返回一个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

以下是一种将基本对象属性复制到扩展基类的对象的方法。

在需要使用基本类型作为派生类型的不幸情况下,我使用以下代码。是的,这违反了里氏替换原则(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>()

由于它使用了反射,因此它是“昂贵的”。请相应使用。


2
AutoMapper这样的工具可以帮助在类似对象类型之间进行此类转换。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接