我正在从父对象创建一个子对象。因此,场景是我有一个对象和一个子对象,该子对象为我想要搜索的场景添加了一个distance属性。我选择使用继承,因为我的UI可以等效地处理搜索对象或不是位置搜索结果的对象列表。因此,在这种情况下,继承似乎是一个明智的选择。
目前我需要从MyObject
的示例生成一个新对象MyObjectSearch
。目前我在构造函数中手动地一个一个地设置属性。我可以使用反射,但这会很慢。有没有更好的方法来实现这种对象增强?
希望下面的代码能够说明这个场景。
public class MyObject {
// Some properties and a location.
}
public class MyObjectSearch : MyObject {
public double Distance { get; set; }
public MyObjectSearch(MyObject obj) {
base.Prop1 = obj.Prop1;
base.Prop2 = obj.Prop2;
}
}
我的搜索功能:
public List<MyObjectSearch> DoSearch(Location loc) {
var myObjectSearchList = new List<MyObjectSearch>();
foreach (var object in myObjectList) {
var distance = getDistance();
var myObjectSearch = new MyObjectSearch(object);
myObjectSearch.Distance = distance;
myObjectSearchList.add(myObjectSearch);
}
return myObjectSearchList;
}
9条答案
按热度按时间xam8gpfp1#
基类需要定义一个复制构造函数:
这样,所有派生类的属性设置都由基类处理。
lrl1mhuk2#
可以使用反射复制属性。
b0zn9rqh3#
不幸的是,没有简单的方法可以做到这一点,正如你所说的,你要么使用反射,要么创建一个“Clone”方法,该方法使用父对象作为输入来生成一个新的子对象,如下所示:
不管怎样,你要么写反射代码(这很慢),要么手工写出每个属性,这完全取决于你是想要可维护性(反射)还是速度(手工属性复制)。
carvr3hs4#
一个通用的解决方案是将它序列化到json并返回.在json-string中没有关于序列化它的类名的信息.大多数人在javascript中这样做.
正如你所看到的,它对pocco对象很有效,但我不能保证它对每一个复杂的情况都有效,但是当属性匹配时,它对非继承类确实有效。
gudnpqoy5#
如果浅层拷贝就足够了,您可以使用
MemberwiseClone
method。示例:
如果您需要深层副本,可以像这样进行序列化/反序列化:https://stackoverflow.com/a/78612/1105687
一个例子(假设您按照答案中的建议编写了一个扩展方法,并将其命名为DeepClone)
tmb3ates6#
基对象具有带属性参数的构造函数似乎是很自然的:
因此,在后代对象中,您可以具有:
这减少了与赋值相关的重复。您可以使用反射来自动复制所有属性,但这种方式似乎更具可读性。
还要注意的是,如果你的类有太多的属性,以至于你考虑自动化属性的复制,那么它们很可能违反Single Responsibility Principle,你应该考虑改变你的设计。
sc4hvdpw7#
有图书馆来处理这个问题;但如果您只是想在一些地方快速实现,我肯定会选择前面建议的"复制构造函数"。
一个有趣的地方没有提到,如果一个对象是一个子类,那么它可以从父对象中访问子对象的私有变量!
因此,在父对象上添加一个
CloneIntoChild
方法。Order
是父类OrderSnapshot
是子类_bestPrice
是Order
上的非只读私有成员。但是Order
可以为OrderSnapshot
设置它。示例:
注意:只读成员变量必须在构造函数中设置,因此您必须使用子构造函数来设置这些...
虽然我通常不喜欢"向上调整",但我经常使用这种方法来分析快照...
vatpfxk58#
我第一次遇到这个问题是在我想这么做的时候。如果你能使用C# 9和
record
-类,你只需要在子类中创建一个新的构造函数,接收一个基类对象,然后把它交给子类:然后,可以按如下方式创建子对象:
贷记https://stackoverflow.com/a/64573044/2582968
dgtucam19#
我建议