2011-12-13 80 views
1

我有一个类简单的两个属性年龄名称。然后,我有另一个类派生自人类类,它有一个额外的属性FavCream。现在,我有这些类的两个不同的实例说H1W1(派生类的女人)和I(基类的)只是想覆盖与的W1所有派生属性相应的值从h1如何重写派生类继承的属性值与基类实例

但是,我没有发现这个内置的。我不喜欢在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; 
     } 
    } 

UPDATE: 我关于创建方法结束,并且使用反射拷贝的基类的属性。此外,我试图用通用限制来增强这一点,但还没有成功。

感谢大家这样的快速回复。

// 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); 
      } 
     } 
+1

什么,如果你有两个实例人类h1和h2?你想从哪里得到属性? –

回答

0

您创建的Human类实例与Woman类实例完全分离。 很难看到你想要达到的目标,也许这是什么?

w1.Age = h1.Age; 
w1.Name = h1.Name; 
+0

是的,但自动。所以,它可以在不同类型的类中重用。 – Santoo

2

是的,你可以使用反射 要提取的所有属性做人力

// get all public static properties of MyClass type 
PropertyInfo[] propertyInfos; 
propertyInfos = typeof(Human).GetProperties(BindingFlags.Public | 
               BindingFlags.Static); 

可以使用的PropertyInfo的GetValue()和的SetValue()从人类获取和设置它为女性的方法。 看MSDN:的SetValue:http://msdn.microsoft.com/en-us/library/axt1ctd9.aspx 的GetValue:http://msdn.microsoft.com/en-us/library/b05d59ty.aspx

而是在运行时分配值的,我建议你重载隐性或显性的操作,简单地做一个铸件从人类到女人。

Woman newWoman = (Woman)H1; 

将人类转换为女性的所有逻辑都将被转储到超载方法中。

0

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

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

0

除了其他的答案,你可以简单地写在Human类中的一些功能,将复制的属性你感兴趣:

class Human 
{ 
    ... 

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

其他解决方案可以使用automapper