从同一个类的实例自动更新现有的Class属性

时间:2013-10-16 03:03:48

标签: c#

最近我想出了一个使用修改后的实例自动更新类属性的想法(that i really don't know whether it would exist or even work)。为了让我的想法更加清晰,我将在下面的代码中解释它。

//The first (Main) instance of the class
Employee carl = new Employee();
carl.Name = "Carl";
carl.Age = 20;
carl.Salary = 7000;

//Here is the same employee data collected from the database a year after...
Employee carl_one_year_later = new Employee();
carl_one_year_later.Age = 21;
carl_one_year_later.Salary = 10000;

//Here comes the idea... I wanna dynamically merge the new collected data to the current main instance of the employee, without missing out the unupdated data ex : his name
employee1 = employee2; //using this seems to overwrite the Name Field with null...

有人可能会说你可以通过这样做来实现这个目标:

carl.Age = carl_one_year_later.Age;
carl.Salary = carl_one_year_later.Salary;

然而,我想要一个动态的方法在一行代码中执行此操作并让C#为我处理属性set,如果我们有一个它也可以派上用场我们不希望每次更新它时都要设置它的大量类。

注意:我希望我成功地提供了我的想法的清晰图像,如果您发现任何问题需要了解我需要什么,请告诉我。

4 个答案:

答案 0 :(得分:1)

using System;
using System.Reflection;

public class Test
{
    public class Employee
    {
        public String Name{get;set;}
        public int Age{get;set;}
        public int Salary{get;set;}
    }
    public static void Main()
    {
        Employee e1 = new Employee{Name="Old", Age=20, Salary=1000};
        Employee e2 = new Employee{Age=30, Salary=5000};

        Copy(e2, e1);

        Console.WriteLine(e1.Name+" "+ e1.Age+" "+e1.Salary );
    }

    public static void Copy<T>(T from, T to)
    {
        Type t = typeof (T);
        PropertyInfo[] props = t.GetProperties(BindingFlags.Public | BindingFlags.Instance);
        foreach (PropertyInfo p in props) {
            if (!p.CanRead || !p.CanWrite) continue;

            object val = p.GetGetMethod().Invoke(from, null);
            object defaultVal = p.PropertyType.IsValueType ? Activator.CreateInstance(p.PropertyType) : null;
            if (null != defaultVal && !val.Equals(defaultVal)) {
                p.GetSetMethod().Invoke(to, new[] {val});
            }
        }
    }
}

答案 1 :(得分:0)

您可以制作CopyTo扩展方法,如下所示:

public static class ObjectExtensions
{
    public static void CopyProperties<T>(this T fromObj, T toObj)
    {
        foreach(var p in typeof(T).GetProperties()) 
        {
            p.SetValue(toObj, p.GetValue(fromObj, null), null);
        }
    }
}

并称之为:

carl_one_year_later.CopyTo(carl);

虽然,老实说,还有一些应该进行的检查,而你最好使用AutoMapper之类的东西。

答案 2 :(得分:0)

Checkout ICloneable OR MemberwiseClone(除非您需要进行深层复制。然后查看对象映射器,如Automapper,ValueInjecter或编写您自己的自定义对象序列化hydrater)

http://msdn.microsoft.com/en-us/library/system.object.memberwiseclone.aspx

MemberwiseClone方法通过创建新对象,然后将当前对象的非静态字段复制到新对象来创建浅表副本。

http://msdn.microsoft.com/en-us/library/system.icloneable.aspx

Alternatives to AutoMapper

答案 3 :(得分:-1)

这个想法本身对我来说很奇怪..

我,我自己,宁可做:

//The first (Main) instance of the class
Employee carl = new Employee();
carl.Name = "Carl";
carl.Age = 20;
carl.Salary = 7000;

//Here we get Carl from the database
Employee carl = GetFromDatabase("Carl") //Illustration
carl.Age = 21;
carl.Salary = 10000;

你的代码就像现在说卡尔和明年卡尔是一个完全不同的人,巧合的是拥有所有相同的属性。

虽然如果确实需要这样做,我确实倾向于选择Automapper ..