Jas*_*ker 9 .net c# interface copying .net-3.5
假设我有两个具有相同接口的类:
interface ISomeInterface
{
int foo{get; set;}
int bar{get; set;}
}
class SomeClass : ISomeInterface {}
class SomeOtherClass : ISomeInterface {}
Run Code Online (Sandbox Code Playgroud)
假设我有一个表示SomeClass的ISomeInterface实例.有没有一种简单的方法可以将其复制到SomeOtherClass的新实例中而无需手动复制每个成员?
更新: 对于记录,我不是试图将SomeClass的实例强制转换为SomeOtherClass的实例.我想做的是这样的事情:
ISomeInterface sc = new SomeClass() as ISomeInterface;
SomeOtherClass soc = new SomeOtherClass();
soc.foo = sc.foo;
soc.bar = soc.bar;
Run Code Online (Sandbox Code Playgroud)
我只是不想为每个人手动执行此操作,因为这些对象具有许多属性.
您可以在每个类中创建隐式运算符以进行转换:
public class SomeClass
{
public static implicit operator SomeOtherClass(SomeClass sc)
{
//replace with whatever conversion logic is necessary
return new SomeOtherClass()
{
foo = sc.foo,
bar = sc.bar
}
}
public static implicit operator SomeClass(SomeOtherClass soc)
{
return new SomeClass()
{
foo = soc.foo,
bar = soc.bar
}
}
//rest of class here
}
Run Code Online (Sandbox Code Playgroud)
然后SomeOtherClass soc = sc;反之亦然.
小智 6
接口的重点不是不必这样做吗?您是否正在使用SomeOtherClass的具体实现?使用界面而不是使用具体实现,如果您使用SomeClass或SomeOther类则无关紧要.
除此之外,您可以做的最好的事情是编写某种辅助函数(您仍然需要手动执行,或查看反射),复制接口上的每个属性,如下所示:
public ISomeInterface CopyValues(ISomeInterface fromSomeClass, ISomeInterface toSomeOtherClass)
{
//copy properties here
return toSomeOtherClass;
}
Run Code Online (Sandbox Code Playgroud)
然而,我的第一直觉是说远离实现并使用你的界面集中精力,那么下面的内容并不重要.
“你能给我一个如何做到这一点的例子吗(或者至少指出我要使用的正确方法)?我似乎无法在 MSDN 上找到它们”\xe2\x80 \x93 贾森·贝克
\n\n杰森,类似以下内容:
\n\nvar props = typeof(Foo)\n .GetProperties(BindingFlags.Public | BindingFlags.Instance);\n\nforeach (PropertyInfo p in props)\n{\n // p.Name gives name of property\n}\nRun Code Online (Sandbox Code Playgroud)\n\n我建议编写一个工具来吐出复制构造函数所需的代码,而不是在运行时进行反思 - 这会降低性能。
\n| 归档时间: |
|
| 查看次数: |
14959 次 |
| 最近记录: |