使用c#中基类的方法在派生对象中填充继承的成员

本文关键字:填充 对象 继承 成员 派生 方法 基类 使用 | 更新日期: 2023-09-27 18:11:11

嘿,伙计们,我想实现这样的东西

class Program
{
    static void Main(string[] args)
    {
        Responsible responsible = new Responsible()
        {
            //I want here to populate with PopulatePerson the base members
            Phone = "93827382",
            Company = "Google"
        };
    }
    public Person PopulatePerson(string pName, string pLastName)
    {
        Person person = new Person();
        person.Name = pName;
        person.LastName = pLastName;
        return person;
    }
}
public class Person
{
    public string Name { get; set; }
    public string LastName { get; set; }
}

public class Responsible : Person
{
    public string Phone { get; set; }
    public string Company { get; set; }
}

数据库查询的情况更复杂但基本上这就是我需要的

我可以在Responsible中使用一个名为Person的成员并执行Person = PopulatePerson("Dan", "Johns")但由于我是继承的,我发现它有点多余

使用c#中基类的方法在派生对象中填充继承的成员

这样怎么样?我为Person创建了一个泛型(静态)工厂方法,它可以在继承自Person的所有类型之间重用。

class Program
{
    static void Main(string[] args)
    {
        //Responsible responsible = new Responsible()
        //{
        //    //I want here to populate with PopulatePerson the base members
        //    Phone = "93827382",
        //    Company = "Google"
        //};
        var responsible = Responsible.Populate("Glenn", "Fake", "93827382", "Google");
        //responsible
    }
    // NO LONGER NEEDED
    // ============================
    //public Person PopulatePerson(string pName, string pLastName)
    //{
    //    Person person = new Person();
    //    person.Name = pName;
    //    person.LastName = pLastName;
    //    return person;
    //}
}
public class Person
{
    public string Name { get; set; }
    public string LastName { get; set; }
    public static TPerson Populate<TPerson>(string name, string lastname) where TPerson : Person, new()
    {
        TPerson person = new TPerson();
        person.Name = name;
        person.LastName = lastname;
        return person;
    }
}

public class Responsible : Person
{
    public static Responsible Populate(string name, string lastname, string phone, string company)
    {
        var p = Responsible.Populate<Responsible>(name, lastname);
        p.Phone = phone;
        p.Company = company;
        return p;
    }
    public string Phone { get; set; }
    public string Company { get; set; }
}

不确定您的实际场景是否有意义,但您可以更改PopulatePerson以接受Person对象作为输入参数,而不是在内部创建一个新对象。然后你可以将新的Responsible对象传递给它,然后设置Phone和Company。

编辑:像这样

class Program
{
    static void Main(string[] args)
    {
        Responsible responsible = new Responsible();
        PopulatePerson(responsible, "first", "last");
        responsible.Phone = "93827382";
        responsible.Company = "Google";
    }
    public static void PopulatePerson(Person person, string pName, string pLastName)
    {
        person.Name = pName;
        person.LastName = pLastName;
    }
}
public class Person
{
    public string Name { get; set; }
    public string LastName { get; set; }
}

public class Responsible : Person
{
    public string Phone { get; set; }
    public string Company { get; set; }
}