наследование в с #.копировать свойства в базовый объект - PullRequest
3 голосов
/ 10 июля 2011

У меня есть объект (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?
   }
}

спасибо

Ответы [ 3 ]

2 голосов
/ 10 июля 2011

Марк Гравелл упоминает в одну сторону, что хорошо.

Другой способ - просто вернуть метод 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 голосов
/ 17 сентября 2016

Вот способ скопировать свойства базового объекта в объект, который расширяет базу.

Я использую следующий код в тех неудачных случаях, когда мне нужно использовать базовый тип как производный тип. Да, это нарушение принципа замещения Лискова (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;
    }

Позволяет:

    derivedObject = baseObect.As<derivedType>()

Поскольку он использует отражение, он "дорогой". Используйте соответственно.

2 голосов
/ 10 июля 2011

Такие инструменты, как AutoMapper , могут помочь переключению этого типа между аналогичными типами объектов.

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