使用接口将对象从一种类型转换为另一种类型?

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)

我只是不想为每个人手动执行此操作,因为这些对象具有许多属性.

Ada*_*sek 9

您可以在每个类中创建隐式运算符以进行转换:

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)

然而,我的第一直觉是说远离实现并使用你的界面集中精力,那么下面的内容并不重要.


Win*_*ith 3

“你能给我一个如何做到这一点的例子吗(或者至少指出我要使用的正确方法)?我似乎无法在 MSDN 上找到它们”\xe2\x80 \x93 贾森·贝克

\n\n

杰森,类似以下内容:

\n\n
var props = typeof(Foo)\n            .GetProperties(BindingFlags.Public | BindingFlags.Instance);\n\nforeach (PropertyInfo p in props)\n{\n     // p.Name gives name of property\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

我建议编写一个工具来吐出复制构造函数所需的代码,而不是在运行时进行反思 - 这会降低性能。

\n