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

c#中的继承。复制基础对象中的属性,c#,inheritance,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;} str

我有一个具有许多属性的对象(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?
   }
}
感谢诸如此类的工具可以帮助这种类型的对象在相似的对象类型之间切换。

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;
    }
}
ObjAA类{
公共静态T ReturnA(),其中T:A,new(){
T oAA=新的T();
//填充
退还高龄津贴;
}
}
然后:

类ObjBB
{
公共空间使用BB()
{
var bb=ObjAA.ReturnA();
//bb是一个B,它从a继承的属性被填充
}
}

以下是将基础对象属性复制到扩展基础对象的方法

在需要将基类型用作派生类型的不幸情况下,我使用以下代码。是的,这违反了Liskov替换原则(LSP),是的,大多数情况下,我们更喜欢组合而不是继承。这是马库斯·克纳彭·约翰逊的道具,他的原始答案是基于此的

此代码位于基类中:

    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;
    }
publictas()
{
var类型=类型(T);
var instance=Activator.CreateInstance(类型);
if(type.BaseType!=null)
{
var properties=type.BaseType.GetProperties();
foreach(属性中的var属性)
if(property.CanWrite)
SetValue(实例,property.GetValue(this,null),null);
}
返回(T)实例;
}
允许:

    derivedObject = baseObect.As<derivedType>()
derivedObject=baseObect.As()

因为它使用反射,所以“昂贵”。相应地使用。

@Avada Kedavra。谢谢,我纠正了这个例子
    derivedObject = baseObect.As<derivedType>()