gpt4 book ai didi

c# - 从同一类的实例自动更新现有的类属性

转载 作者:太空宇宙 更新时间:2023-11-03 16:06:00 28 4
gpt4 key购买 nike

最近我想出了一个想法(我真的不知道它是否会存在甚至工作) 使用它的修改实例自动更新类的属性。为了让我的想法更清楚一点,我将在下面的代码中进行解释。

//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,如果我们有一个庞大的类,我们不想在每次更新时都设置它的属性。

注意:我希望我能成功地提供我的想法的清晰图像,如果您在理解我到底需要什么方面有任何问题,请告诉我。

最佳答案

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});
}
}
}
}

关于c# - 从同一类的实例自动更新现有的类属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19394540/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com