C# инициализация производного класса - PullRequest
0 голосов
/ 04 мая 2020

Мой C# сценарий кода:

public class BaseClass 
{
       public int A;
       public float B;
       //a multitude of other fields
       public string Y;
};

public class DerivedClass:BaseClass {
       public string Z;
       public DerivedClass (BaseClass b) {
       //??
       }
}

Я хочу написать этот конструктор DerivedClass без явного поэлементного копирования. В C ++ конструктор BaseClass по умолчанию сделает это за меня. Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 04 мая 2020

Я не знаю простого способа написать полнофункциональный конструктор копирования в c#. Так что либо вы реализуете его в BaseClass вручную, либо можете использовать Reflection для автоматизации.

Последний вариант - попытаться использовать Automapper , который будет иметь некоторые ограничения (но для предоставленного кода должен работать) с точки зрения того, что он может обрабатывать - только свойства / поля publi c будут будет отображаться, и реализация будет выглядеть так:

public class BaseClass
{
    private static readonly IMapper _mapper;
    static BaseClass()
    {
        var config = new MapperConfiguration(cfg => cfg.CreateMap<BaseClass, BaseClass>());
        _mapper = config.CreateMapper();
    }
    public int A;
    public float B;
    //a multitude of other fields
    public string Y;
    public BaseClass(){}
    public BaseClass(BaseClass b)
    {
        _mapper.Map<BaseClass, BaseClass>(b,this);
    }
};

public class DerivedClass : BaseClass
{
    public string Z;
    public DerivedClass(BaseClass b): base(b)
    {
    }
}
0 голосов
/ 04 мая 2020

Вы спрашиваете, есть ли простой способ создать конструктор копирования в C#.

Нет, нет способа сделать это, не указав поля, которые вы хотите скопировать, в одном из конструкторов явно.

см. docs для получения дополнительной информации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...