C# 如何用基类实例的继承属性值覆盖派生类的继承属性值

C# 如何用基类实例的继承属性值覆盖派生类的继承属性值,c#,.net,C#,.net,我有一个Human类,它有两个简单的属性:年龄和名字。然后,我有另一个类Woman派生自Human类,它有一个额外的属性favStream。现在,我有两个不同的类实例,分别是h1(基类Human)和w1(派生类Woman),我只想用h1中相应的值覆盖w1的所有派生属性 但是,我没有找到这个内置的。我不喜欢在Woman类上创建一个公共方法来手动执行分配任务。我认为,我可以使用反射特性创建一个实用函数,但需要寻找经过验证的方法来处理这个问题 这不可能吗?在这种情况下,我们不能有继承的优势吗?还是这不

我有一个Human类,它有两个简单的属性:年龄和名字。然后,我有另一个类Woman派生自Human类,它有一个额外的属性favStream。现在,我有两个不同的类实例,分别是h1(基类Human)和w1(派生类Woman),我只想用h1中相应的值覆盖w1的所有派生属性

但是,我没有找到这个内置的。我不喜欢在Woman类上创建一个公共方法来手动执行分配任务。我认为,我可以使用反射特性创建一个实用函数,但需要寻找经过验证的方法来处理这个问题

这不可能吗?在这种情况下,我们不能有继承的优势吗?还是这不合逻辑

请对我有耐心。谢谢

class Program
    {
        private static Woman _aWoman;

        static void Main(string[] args)
        {
            var aHuman = new Human() { Age = 25, Name = "Ram" };
            Program._aWoman = new Woman() { Age = 22, FavCream = "Ponds" , Name = "Sita"};
            Console.WriteLine("Woman is " + Program._aWoman.ToString()); // prints Age = 22 Name = Sita FavCream = Ponds
            Console.WriteLine("Human is " + aHuman.ToString()); // prints Age = 25 Name = Ram

            **// Do something here so woman derived property has auto over written with property of human instance.**

            Console.WriteLine("after overwriting, woman is " + _aWoman.ToString());
            // The result I m looking for here is  "Age = 25 Name = Ram FavCream = Ponds"
        }
    }

    internal class Human
    {
        public int Age { get; set; }
        public string Name { get; set; }

        public override string ToString()
        {
            return "Age = " + this.Age + " Name = " + this.Name;
        }
    }

    internal class Woman: Human
    {
        public string FavCream { get; set; }

        public override string ToString()
        {
            return base.ToString() + " FavCream = " + this.FavCream;
        }
    }
更新: 我最后创建了一个方法,并使用反射复制了基类属性。此外,我试图通过一般限制来增强这一点,但尚未成功

谢谢大家这么快的回复

// Trying to make it generic... but could not enforce contraint that T must be base class of 'this'
        public void Overwrite<T>(T baseInstance) where T : Human 
        {
            Type baseType = baseInstance.GetType();
            Type derivedType = this.GetType();
            PropertyInfo[] propInfos = null;

            propInfos = baseType.GetProperties();

            foreach (PropertyInfo eachProp in propInfos)
            {
                PropertyInfo baseProp = (baseType).GetProperty(eachProp.Name);
                object baseVal = baseProp.GetValue(baseInstance, null);
                eachProp.SetValue(this, baseVal, null);
            }
        }
//试图使其通用化。。。但无法强制约束T必须是“this”的基类
public void Overwrite(T baseInstance),其中T:Human
{
类型baseType=baseInstance.GetType();
Type derivedType=this.GetType();
PropertyInfo[]PropInfo=null;
PropInfo=baseType.GetProperties();
foreach(PropInfo中每种作物的属性信息)
{
PropertyInfo baseProp=(baseType).GetProperty(eachProp.Name);
object baseVal=baseProp.GetValue(baseInstance,null);
eachProp.SetValue(this,baseVal,null);
}
}

您创建的Human类实例与Woman类实例完全独立。 很难看出你想要实现什么,也许是这个

w1.Age = h1.Age;
w1.Name = h1.Name;

是的,你可以用反射来做 获取人的所有属性

// get all public static properties of MyClass type
PropertyInfo[] propertyInfos;
propertyInfos = typeof(Human).GetProperties(BindingFlags.Public |
                                              BindingFlags.Static);
您可以使用PropertyInfo GetValue()和SetValue()方法从Human获取并将其设置为Woman。 查看MSDN:SetValue: GetValue:

与其在运行时赋值,我建议您重载隐式或显式运算符,只需从人到女人进行转换

Woman newWoman = (Woman)H1;

把人变成女人的所有逻辑都会被过度加载的方法抛弃。

你所要求的是不合逻辑的。即使您有两个Woman实例,w1和w2,也没有将所有属性从w1复制到w2的内置机制


您需要使用反射来实现这一点,但这是一个相当简单的操作。

除了其他答案之外,您只需在
Human
类中编写一些函数,它将复制您感兴趣的属性:

class Human
{
    ...

    public void CopyFrom(Human h)
    {
        this.Age = g.Age;
        this.Name = g.Name;
    }
}

其他解决方案可以使用
automapper

如果您有两个人类h1和h2实例,该怎么办?您希望w1从何处获取属性?是的,但会自动执行。因此,它可以跨不同类型的类重用。