C# 复制实现同一接口的所有参数

C# 复制实现同一接口的所有参数,c#,interface,C#,Interface,我正在寻找最佳解决方案,例如: (让我们用伪代码交谈!) 有什么简单的方法可以做到这一点吗?要实现你的目标,你需要做的就是: -从IObj接口获取所有属性 -从ObjectA类获取所有属性 -从ObjectB类获取所有属性 -从IObj接口加入属性名称集合,并将ObjectA中的属性与ObjectB -迭代这些对,并对ObjectA中的属性调用GetValue(),对ObjectB中的属性调用SetValue() 这是我在LinqPad中写的: void Main() { var a =

我正在寻找最佳解决方案,例如: (让我们用伪代码交谈!)


有什么简单的方法可以做到这一点吗?

要实现你的目标,你需要做的就是: -从
IObj
接口获取所有属性 -从
ObjectA
类获取所有属性 -从
ObjectB
类获取所有属性 -从
IObj
接口加入属性名称集合,并将
ObjectA
中的属性与
ObjectB
-迭代这些对,并对
ObjectA
中的属性调用
GetValue()
,对
ObjectB
中的属性调用
SetValue()

这是我在LinqPad中写的:

void Main()
{
    var a = new ObjectA
    {
        propertyX = Guid.NewGuid().ToString(),
        propertyY = Guid.NewGuid().ToString()
    };
    var b = new ObjectB(a);
    b.Dump();
}


public interface IObj
{
    string propertyX{get;set;}
    string propertyY{get;set;}
}

public class ObjectA : IObj
{
    public string propertyX{get;set;}
    public string propertyY{get;set;}
}

public class ObjectB: IObj
{
    public string propertyX{get;set;}
    public string propertyY{get;set;}

    public ObjectB(ObjectA a)
    {
        var properties = typeof(IObj).GetProperties();
        var objAProperties = typeof(ObjectA).GetProperties();
        var objBProperties = typeof(ObjectB).GetProperties();
        var common = from p in properties
                     from propA in objAProperties
                     from propB in objBProperties
                     where p.Name == propA.Name && p.Name == propB.Name
                     select Tuple.Create(propA, propB);
        foreach(var tuple in common)
        {
            var value = tuple.Item1.GetValue(a);
            tuple.Item2.SetValue(this, value);
        }
    }
}
以后编辑

要在接口上创建扩展方法,请执行以下操作:

public static class ObjExtesions
{
    public static void CopyProperties(this IObj source, IObj destination)
    {
        var properties = typeof(IObj).GetProperties();
        var objAProperties = source.GetType().GetProperties();
        var objBProperties = destination.GetType().GetProperties();
        var common = from p in properties
                     from propA in objAProperties
                     from propB in objBProperties
                     where p.Name == propA.Name && p.Name == propB.Name
                     select Tuple.Create(propA, propB);
        foreach(var tuple in common)
        {
            var value = tuple.Item1.GetValue(source);
            tuple.Item2.SetValue(destination, value);
        }
    }
}
然后,在
ObjectB
构造函数中更改代码:

public ObjectB(ObjectA a)
{
    a.CopyProperties(this);
}

坏主意,每次你触摸ObjectA或ObjectB或IObj时,任何“自动”解决方案都很可能会让你的应用程序启动。你不应该
ObjectB:ObjectA
?问题是我无法编辑ObjectA和接口,我只需要将所有属性复制到ObjectB,但ObjectA已经。。。来自接口IObj的大约300个参数,我建议将
public-ObjectB(ObjectA)
更改为
public-ObjectB(IObj)
。如果ObjectB不需要ObjectA,它就不应该知道ObjectA。您在问题中声明只需要有关
IObj
的信息,因此您应该真正更改签名以匹配该信息。我不确定这一点,但您能否将此代码实现为接口的扩展方法?不能保证类中名为X的属性是接口中实现属性X的属性。您可以直接使用两个对象的
p
值和读/写值,而不需要查找类本身的属性。当然,假设所讨论的类实际实现了接口。您无法将其作为接口的扩展方法可靠地实现,因为它在实现接口的类型上可用,但不会告诉该方法您感兴趣的接口。我添加了扩展方法。
public ObjectB(ObjectA a)
{
    a.CopyProperties(this);
}