【发布时间】:2017-05-08 08:01:21
【问题描述】:
我想将一个接口的实例传递给一个对象,并将这个对象的所有值初始化为传入的对象的值,其中两个对象都实现相同的接口?在这种共享界面的特殊情况下,是否有任何好的快捷方式。在我看来一定有……我只是想不起来……
编辑:在约翰的反馈之后,问题更好地表达为 - 我如何将 interface 的实例传递给对象的构造函数并将该对象的所有值初始化为接口的值实例传入?
大多数深度复制解决方案(包括我自己以前的解决方案)都返回一个对象——它不能在构造函数中工作,或者依赖于创建一个新实例(它不能使用作为源和目标的接口) )。
我想同时传入源和目标,并将源的属性复制到它们都是接口的目标。是否有现有的解决方案。或者我是否重新审视我自己的代码并尝试对其进行调整 - 我从 2009 年开始自己的解决方案(在答案中纠正了小错误)SetValue on PropertyInfo instance error "Object does not match target type" c# 和transfering one object properties values to another one 中的 svics 答案足以满足所有属性只是值的简单情况。
例如
public interface ISomething
{
...
}
public class A : ISomething
{
public A(ISomething input)
{
// what goes here??
}
}
【问题讨论】:
-
不,没有 C# 功能。可能有映射库可以做到这一点,但在各种情况下,您需要提供 很多 更多信息。如果接口中既有方法又有属性怎么办?如果一个属性是一个复杂的对象怎么办——你只是喜欢复制引用,还是需要深度克隆?
-
@JonSkeet: ...如果某些属性必须按特定顺序分配(在值之前考虑最小值和最大值)怎么办?
-
好的,我明白了。我很早就知道所有问题,并且熟悉 MiscUtil.Reflection.PropertyCopy 和类似的复制实现(包括我多年来自己的)来处理提到的所有问题。我想我的问题变得不同了。我将进行编辑以澄清。
-
天哪,我已经完全忘记了 MiscUtil.Reflection.PropertyCopy。它当然不会尝试应对任何这些……
-
请注意,如果您在界面中提供具体示例而不仅仅是“...”,这将是一个非常清晰的问题。
标签: c#