如何通过派生类设置基类的所有属性


public BaseClass
{
    prop abc;
    prop pqr;
    prop xyz;    
}
public DerivedClass : BaseClass
{
   prop New1;
   prop New2;
  //constructor
  public DerivedClass(BaseClass baseObj,someMore params)
  {
      this.abc = baseObj.abc;
      this.pqr = baseObj.pqr;
      this.xyz = baseObj.xyz;
      /* I do not want to do this for each and every property as I have more than 40 properties */
  }
}

在上面的代码中,我如何设置派生类的所有属性,这些属性在派生类中与基类相同。

在我的派生类中我可以在不使用自动映射器反射的情况下执行以下类型以实现上述操作吗

public DerivedClass(BaseClass baseObj,someMore params):base(baseObj) //or something similar
{
}

可以初始化基类而不是派生类中的属性(因为参数和基类共享相同类型的类(。

要复制属性,除了AutoMapper(我发现它真的很慢(和反射(很难实现和维护(,一个简单,非常有效的方法是使用开源库Omu.ValueInjecter:

从 NuGet 安装库:

Install-Package ValueInjecter -Version 3.1.3

然后,在构造函数中使用它,如下所示:

using Omu.ValueInjecter;
public abstract class BaseClass
{
    protected BaseClass(BaseClass baseObj)
    {
        this.InjectFrom(baseObj);
    }
    public string Abc { get; set; }
    public int Pqr { get; set; }
    public object Xyz { get; set; }
}
public class DerivedClass : BaseClass
{
    public DerivedClass(BaseClass baseObj, int new1, object new2) : base(baseObj)
    {
        New1 = new1;
        New2 = new2;
    }
    public int New1 { get; set; }
    public object New2 { get; set; }
}

第一次运行此代码时,它将创建一个映射器并将其存储在内存中,因此接下来执行相同操作的时间会快得多。

如果不想使用值注入器或任何其他库,只需在基类中手动设置属性即可。

public abstract class BaseClass
{
    protected BaseClass(BaseClass baseObj)
    {
        Abc = baseObj.Abc;
        Pqr = baseObj.Pqr;
        Xyz = baseObj.Xyz;
    }
    [...]
}

您可以使用原型模式。如果您使用 C#,请参考如下代码:

public abstract class BaseClass
{
    public int a;
    public int b;
    public int c;
    public abstract BaseClass Clone();
}
public class DerivedClass : BaseClass
{
    public int new1;
    public int new2;
    public override BaseClass Clone()
    {
        return this.MemberwiseClone() as BaseClass;
    }
    public override string ToString()
    {
        return string.Format("{0}{1}{2}{3}{4}", a, b, c, new1, new2);
    }
}
class Program
{
    static void Main(string[] args)
    {
        DerivedClass AClass = new DerivedClass();
        AClass.a = 1;
        AClass.b = 2;
        AClass.c = 3;
        DerivedClass BClass = AClass.Clone() as DerivedClass;
        BClass.new1 = 4;
        BClass.new2 = 5;
        Console.WriteLine(BClass.ToString());
    }
}

它来自 https://mobilechos.blogspot.com/2019/04/prototype-pattern-with-csharp.html。

最新更新