不能。
虽然我说了不能,但是我还是给出一种曾经的解决方案,此方案很巧妙,但是劝你别这样用,不过它确实做到了不是“一个字段一个字段的赋值”,而是对“所有字段值的整体拷贝”。
序列化的思路不错~
这个需求挺奇怪的,为什么要这样设计呢。如果不逐个属性复制,可以通过反射来实现,遍历Father类实例里面public和protect的属性,获取其值,实例化一个Son类的实例。
我想给一个类拓展一个属性,但现在只能拿到父类的实例
using System; using System.Collections.Generic; using System.Linq; using System.Reflection; using System.Text; using System.Threading.Tasks; namespace GetSon { class Program { static void Main(string[] args) { Father father = new Father(); father.Name = "Joey"; Son son = new Son(); son.Fill(father); Console.WriteLine(son.Name); Console.ReadKey(); } } class Father { public String Name { get; set; } } class Son : Father { public int Age { get; set; } } static class Helper { public static void Fill(this Father father, Father sourceFather) { Type t = typeof(Father); PropertyInfo[] props = t.GetProperties(); foreach (var item in props) { item.SetValue(father, item.GetValue(sourceFather)); } } } }
@l3oz: 给一个类拓展一个属性 是什么意思?你想修改代码,加一个新属性?你的意思是说:你想给父类加一个新属性,子类不需要修改代码就可以从父类里得到这个属性的值?你看看我写的代码可以不,不过有点问题,我写的代码只对public的属性起作用。
@会长: 明白你的意思~我也这样搞过,想看看有什么更好的思路或者设计
class Program { public static void Main(string[] args) { Father f = new Father(); f.LastName = "aaa"; Son s = new Son(f); Console.WriteLine(s.LastName); Console.Read(); } } public class Father { public string LastName { get; set; } public Father() { } public Father(Father f) { this.LastName = f.LastName; } } public class Son : Father { public Son() { } public Son(Father f) : base(f) { } public string FirstName { get; set; } }
刚才动了下脑筋,这样写不知道可以吗?虽说是有一个赋值的语句,但是无论多少个具体的父类实例都可以用这一个代码啊,只需实例化就行了。
这还是逐个属性赋值
这样是不可以的
只能逐个属性赋值,可以借助AutoMapper帮你自动完成
需求虽然有点怪,但是实现是完全可以的
son是从father派生来的,所以可以通过映射的方式来给son部分属性进行赋值(从father中继承来的)
至于son其他的属性那么只能通过反射来实现了