Подтвердить что ты не робот

Отбросить объект Parent к объекту Child в С#

Привет, я хочу передать объект Parent объекту Child в С#

public class Parent
{
    public string FirstName {get; set;}
    public string LastName {get; set;}
    public string City {get; set;}
}

public class Child : Parent
{
    public string PhoneNumber {get; set;}
    public string MobileNumber {get; set;}
}

теперь сценарий - это список родительского объекта, и я хочу сгенерировать список дочерних объектов, чтобы я мог иметь расширенную информацию

List<Parent> lstParent;
List<Child> lstChild = new List<Child>();

foreach(var obj in lstParent)
{
    lstChild.add((Child)obj);
}

как дочерний класс, унаследованный родительский класс, так что у дочернего класса уже есть родительский член класса, я просто хочу их автоматически заполнить, чтобы я мог заполнить datamember дочернего класса

4b9b3361

Ответ 1

Если я правильно понимаю ваш комментарий "Я просто хочу их правильно заполнить", вы хотите создать новый дочерний объект, который заполняется значениями родителя, со значениями по умолчанию для новых свойств. Лучший способ сделать это - создать конструктор, который копирует значения:

public class Parent
{
   public string FirstName {get; set;}
    public string LastName {get; set;}
    public string City {get; set;}
}

public class Child : Parent
{
    public string PhoneNumber {get; set;}
    public string MobileNumber {get; set;}

    public Child (Parent parentToCopy)
    {
        this.FirstName = parentToCopy.FirstName;
        this.LastName = parentToCopy.LastName;
        this.City = parentToCopy.City;

        this.PhoneNumber = string.Empty; // Or any other default.
        this.MobileNumber = string.Empty;
    } 
}

Теперь вы можете использовать LINQ, как и ответы выше, для создания Ребенка из каждого родителя:

List<Child> lstChild = lstParent.Select(parent => new Child(parent)).ToList();

Обратите внимание, что это очень похоже на @daryal answer, но обертывает логику копирования от родителя к ребенку внутри конструктора, а не имеет его снаружи в вызове new Child().

Ответ 2

Я делаю так (это просто пример):

using System.Reflection;

public class DefaultObject
{
    ...
}

public class ExtendedObject : DefaultObject
{
    ....
    public DefaultObject Parent { get; set; }

    public ExtendedObject() {}
    public ExtendedObject(DefaultObject parent)
    {
        Parent = parent;

        foreach (PropertyInfo prop in parent.GetType().GetProperties())
            GetType().GetProperty(prop.Name).SetValue(this, prop.GetValue(parent, null), null);
    }
}

Использование:

DefaultObject default = new DefaultObject { /* propery initialization */ };
ExtendedObject extended = new ExtendedObject(default); // now all properties of extended are initialized by values of default properties.
MessageBox.Show(extended.Parent.ToString()); // now you can get reference to parent object

Ответ 3

Мне понравилось:

class Parent
{
  ...
}

class Child :Parent
{
  ...
  public Child(Parent p)
  {
            foreach (FieldInfo prop in  p.GetType().GetFields())
                GetType().GetField(prop.Name).SetValue(this, prop.GetValue( p));

            foreach (PropertyInfo prop in  p.GetType().GetProperties())
                GetType().GetProperty(prop.Name).SetValue(this, prop.GetValue( p, null), null);
  }
}

Ответ 4

Вот что я придумал с моим решением.

    public static void ShallowConvert<T, U>(this T parent, U child)
    {
        foreach (PropertyInfo property in parent.GetType().GetProperties())
        {
            if (property.CanWrite)
            {
                property.SetValue(child, property.GetValue(parent, null), null);
            }
        }
    }

Ответ 5

Вы также можете использовать отражение, но это проще для вашего случая.

foreach(var obj in lstParent)
{
    Child child = new Child(){ FirstName = obj.FirstName, LastName=obj.LastName, City = obj.City};
    child.MobileNumber = "some mobile number";
    child.PhoneNumber = "some phone number";
    lstChild.Add((Child)obj);
}

Ответ 6

var lstChild = lstParent.Cast<Child>().ToList();

или

var lstChild = lstParent.ConvertAll(x=>(Child)x);
Тем не менее, оба эти предположения предполагают, что список Parent фактически содержит экземпляры Child. Вы не можете изменить фактический тип объекта.

Ответ 7

Чтобы downcast (термин, используемый для описания приведения объекта родительского класса к дочернему классу), вы можете попробовать сначала перенести родительский объект на тип объекта, а затем передать объект дочернему типу.

Parent p = new Parent();

Child c = (Child)((object) p);