从一个对象初始化另一个对象,它们共享一个公共接口c#

从一个对象初始化另一个对象,它们共享一个公共接口c#,c#,C#,我想传入一个接口实例到一个对象,并将这个对象的所有值初始化为传入的对象的值,其中两个对象实现相同的接口?在这种特殊情况下,它们共享一个界面,有没有好的快捷方式。在我看来一定有。。。我只是想不起来 编辑:在John的反馈之后,这个问题更好地表达为-如何将接口实例传递给对象的构造函数,并将此对象的所有值初始化为传递的接口实例的值 大多数深度复制解决方案(包括我自己以前的解决方案)都会返回一个对象——它不会在构造函数中工作,或者依赖于创建一个新实例(它不会使用接口作为源和目标) 我希望同时传入源和目标

我想传入一个接口实例到一个对象,并将这个对象的所有值初始化为传入的对象的值,其中两个对象实现相同的接口?在这种特殊情况下,它们共享一个界面,有没有好的快捷方式。在我看来一定有。。。我只是想不起来

编辑:在John的反馈之后,这个问题更好地表达为-如何将接口实例传递给对象的构造函数,并将此对象的所有值初始化为传递的接口实例的值

大多数深度复制解决方案(包括我自己以前的解决方案)都会返回一个对象——它不会在构造函数中工作,或者依赖于创建一个新实例(它不会使用接口作为源和目标)

我希望同时传入源和目标,并将源的属性复制到目标,它们都是接口。是否有一个现有的解决方案。或者,我应该重新审视自己的代码并尝试对其进行修改——我以前从2009年开始的解决方案(答案中纠正了小错误)和svics答案足以满足所有属性都只是值的简单情况

e、 g


只需在构造函数中设置接口的所有属性:

public class A : ISomething
{
    public A(ISomething input)
    {
        A.MyProperty = input.MyProperty;
        A.AnotherProperty = somethingNotFromTheInterface
    }
}
这被称为一个。这实际上是创建现有实例的深层副本还是浅层副本取决于它是否包含对其他引用类型的引用。在这种情况下,您还必须重新创建所有这些实例:

    public A(ISomething input)
    {
        A.MyProperty = new MyType(input.MyProperty);
        A.AnotherProperty = somethingNotFromTheInterface
    }
它本身假设您也有一个
MyProperty
类型的复制构造函数


当您的界面相当大时,这可能会成为一项巨大的任务。在这种情况下,您可以考虑用反射来循环所有接口属性,或者更好地重新考虑接口是否实际服务于单个目的而不做太多。

< P>简单地设置构造函数中的接口的所有属性:

public class A : ISomething
{
    public A(ISomething input)
    {
        A.MyProperty = input.MyProperty;
        A.AnotherProperty = somethingNotFromTheInterface
    }
}
这被称为一个。这实际上是创建现有实例的深层副本还是浅层副本取决于它是否包含对其他引用类型的引用。在这种情况下,您还必须重新创建所有这些实例:

    public A(ISomething input)
    {
        A.MyProperty = new MyType(input.MyProperty);
        A.AnotherProperty = somethingNotFromTheInterface
    }
它本身假设您也有一个
MyProperty
类型的复制构造函数


当您的界面相当大时,这可能会成为一项巨大的任务。在这种情况下,您可以考虑用反射来循环所有接口属性,或者更好地重新考虑接口是否实际上是服务于单个目的而不是做得太多。

< P>我不太确定我完全理解您的限制,但是对于大多数对象复制工作,我使用AutoPAPER,这对复制对象的繁重工作有很大帮助。这意味着与在构造函数中复制属性不同的方法,但可能有用。下面是一些示例代码:

public interface ISomething {
    string MyProperty { get; set; }
    int AnotherProperty { get; set; }

    B ClassProperty { get; set; }
}

public class A : ISomething {
    public string MyProperty { get; set; }
    public int AnotherProperty { get; set; }
    public B ClassProperty { get; set; }
}

public class B {
    public string BProperty_1 { get; set; }
    public int BProperty_2 { get; set; }
}

class Program {
    static void Main(string[] args) {

        // Configure the mapping
        Mapper.Initialize(cfg => cfg.CreateMap<ISomething, ISomething>());

        // Initialize first instance
        var firstA = new A {
            MyProperty = "Test",
            AnotherProperty = 21,

            ClassProperty = new B {
                BProperty_1 = "B String",
                BProperty_2 = 555
            }
        };

        // Initialize second instance and perform the mapping
        var secondA = Mapper.Map<ISomething>(firstA);
公共接口{
字符串MyProperty{get;set;}
int其他属性{get;set;}
B类属性{get;set;}
}
公共A级:等轴运动{
公共字符串MyProperty{get;set;}
公共int其他属性{get;set;}
公共B类属性{get;set;}
}
公共B级{
公共字符串BProperty_1{get;set;}
公共int-BProperty_2{get;set;}
}
班级计划{
静态void Main(字符串[]参数){
//配置映射
初始化(cfg=>cfg.CreateMap());
//初始化第一个实例
var firstA=新的A{
MyProperty=“测试”,
另一个属性=21,
ClassProperty=newb{
BProperty_1=“B字符串”,
BProperty_2=555
}
};
//初始化第二个实例并执行映射
var secondA=Mapper.Map(firstA);
在这里,firstA中的所有属性都复制到secondA,包括ClassProperty中的属性


映射配置在启动时执行一次,并使用递归和反射来构建映射模型。然后它可以在代码中的任何位置使用。如果在接口中添加新属性,映射配置将保持不变。

我不确定我是否完全理解您的限制,但对于大多数对象复制工作而言我使用AutoMapper,它极大地帮助了复制对象的繁重工作。它意味着一种不同于在构造函数中复制属性的方法,但可能很有用。下面是一些示例代码:

public interface ISomething {
    string MyProperty { get; set; }
    int AnotherProperty { get; set; }

    B ClassProperty { get; set; }
}

public class A : ISomething {
    public string MyProperty { get; set; }
    public int AnotherProperty { get; set; }
    public B ClassProperty { get; set; }
}

public class B {
    public string BProperty_1 { get; set; }
    public int BProperty_2 { get; set; }
}

class Program {
    static void Main(string[] args) {

        // Configure the mapping
        Mapper.Initialize(cfg => cfg.CreateMap<ISomething, ISomething>());

        // Initialize first instance
        var firstA = new A {
            MyProperty = "Test",
            AnotherProperty = 21,

            ClassProperty = new B {
                BProperty_1 = "B String",
                BProperty_2 = 555
            }
        };

        // Initialize second instance and perform the mapping
        var secondA = Mapper.Map<ISomething>(firstA);
公共接口{
字符串MyProperty{get;set;}
int其他属性{get;set;}
B类属性{get;set;}
}
公共A级:等轴运动{
公共字符串MyProperty{get;set;}
公共int其他属性{get;set;}
公共B类属性{get;set;}
}
公共B级{
公共字符串BProperty_1{get;set;}
公共int-BProperty_2{get;set;}
}
班级计划{
静态void Main(字符串[]参数){
//配置映射
初始化(cfg=>cfg.CreateMap());
//初始化第一个实例
var firstA=新的A{
MyProperty=“测试”,
另一个属性=21,
ClassProperty=newb{
BProperty_1=“B字符串”,
BProperty_2=555
}
};
//初始化第二个实例并执行映射
var secondA=Mapper.Map(firstA);
在这里,firstA中的所有属性都复制到secondA,包括ClassProperty中的属性

映射配置在启动时执行一次,并使用递归和反射来构建映射模型。然后它可以在代码中的任何位置使用。如果在接口中添加新属性,映射配置将保持不变。

否,没有用于此的C#功能。可能有映射库可以做到这一点,但在很多情况下,你需要提供更多的信息