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);
}