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