gpt4 book ai didi

c# - 将所有类字段和属性复制到另一个类

转载 作者:太空狗 更新时间:2023-10-30 01:04:47 25 4
gpt4 key购买 nike

我有一个通常包含字段、属性的类。我想要实现的不是这个:

class Example
{
public string Field = "EN";
public string Name { get; set; }
public int? Age { get; set; }
public List<string> A_State_of_String { get; set; }
}

public static void Test()
{
var c1 = new Example
{
Name = "Philip",
Age = null,
A_State_of_String = new List<string>
{
"Some Strings"
}
};
var c2 = new Example();

//Instead of doing that
c2.Name = string.IsNullOrEmpty(c1.Name) ? "" : c1.Name;
c2.Age = c1.Age ?? 0;
c2.A_State_of_String = c1.A_State_of_String ?? new List<string>();

//Just do that
c1.CopyEmAll(c2);
}

我想出了什么但没有按预期工作。

public static void CopyEmAll(this object src, object dest)
{
if (src == null) {
throw new ArgumentNullException("src");
}

foreach (PropertyDescriptor item in TypeDescriptor.GetProperties(src)) {
var val = item.GetValue(src);
if (val == null) {
continue;
}
item.SetValue(dest, val);
}
}

问题:

  • 虽然我检查了null,但它似乎绕过了它。
  • 似乎不会复制字段。

注意事项:

  • 我不想使用 AutoMapper 解决一些技术问题。
  • 我希望该方法复制值而不是创建新对象。 [只需模仿我在示例中陈述的行为]
  • 我希望该函数是递归的[如果该类包含另一个类,它会将其值也复制到最内部的一个]
  • 不想复制 null 或空值,除非我允许。
  • 复制所有字段、属性甚至事件。

最佳答案

基于 Leo 的回答,但使用Generics 并复制字段:

public void CopyAll<T>(T source, T target)
{
var type = typeof(T);
foreach (var sourceProperty in type.GetProperties())
{
var targetProperty = type.GetProperty(sourceProperty.Name);
targetProperty.SetValue(target, sourceProperty.GetValue(source, null), null);
}
foreach (var sourceField in type.GetFields())
{
var targetField = type.GetField(sourceField.Name);
targetField.SetValue(target, sourceField.GetValue(source));
}
}

然后就是:

CopyAll(f1, f2);

关于c# - 将所有类字段和属性复制到另一个类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21769532/

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