【发布时间】:2017-07-04 20:23:36
【问题描述】:
我有一个通常包含字段、属性的类。我想要实现的不是这个:
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 或空值。
- 复制所有字段、属性甚至事件。
【问题讨论】:
-
要复制字段,您必须使用字段集合 item.GetType().GetFields()
-
@VMA:你能提供一个答案吗?我也不希望它是递归的,所以它对每个孩子都做同样的事情。
-
@VMA:我很抱歉,但你能再看一下笔记吗,我更新了它们以满足我的所有要求。如果你能帮忙,请因为我过去 3 天都在尝试,但没有运气,
-
对不起,我不明白。您想要“复制值而不是创建新对象的方法”,同时想要“递归函数”。如果你将一个对象复制到另一个类,这意味着你传递了它的引用,所有的字段都是一样的。
-
我想将所有东西作为对目的地的参考,就好像你只是在做
object1 = object2。
标签: c#