【问题标题】:Convert a class to a possible interface将类转换为可能的接口
【发布时间】:2015-05-03 04:28:46
【问题描述】:

我在不同的项目中有两个接口(这些项目没有相互引用),它们具有相同的方法,如下所示:

在第一个项目中,我们有:

public interface IInterfaceA
{
     IAViewModel Do();
}
public interface IAViewModel
{
     int Id { get; set; }
}
public class ServiceA : IInterfaceA
{
     public IBViewModel Do()
     {
         return null;
     }
}

在第二个项目中,我们有:

public interface IInterfaceB
{
    IBViewModel Do();
}
public interface IBViewModel
{
    int Id { get; set; }
}

我可以在运行时创建一个 ServiceA 实例,使用来自第二个项目的一些 Reflection

问题是如何将该服务转换为 IInterfaceB。我的意思是当有人开发时,我想通过引用 IInterfaceB 来访问它的方法。

【问题讨论】:

  • “这些项目没有相互引用”是指在运行时加载其他程序集的类型还是其他什么?
  • @SaeedHamed 如果该类型未实现该接口,则您不能使用该接口调用该类型的方法。类型实现另一个具有相同方法的接口并不重要。
  • @phoog:请注意,在此代码示例中,ServiceA 确实实现了具有相同方法的另一个接口。显示的唯一Do() 方法返回IBViewModel 的实例,这会阻止它成为IInterfaceA 的实现。
  • @jdphenix 是的,你猜对了,我在运行时加载我的程序集。

标签: c# design-patterns reflection interface inversion-of-control


【解决方案1】:

如果我正确理解您更新的问题,ServiceA 类实现 IInterfaceA 的事实与问题无关(您甚至不知道实现的成员)。

就您似乎要问的问题而言——是否可以将ServiceA 的实例视为IInterfaceB 的实现实例——该问题的答案是“否”。

但是,您可以通过至少两种方式之一来近似该结果:

  1. 使用dynamic 类型。在这里,对象不会以IInterfaceB 显示,但您至少可以通过类型为dynamic 的变量调用Do() 方法。
  2. ServiceA 的实例包装在一个适配器类中,该类实现IInterfaceB,并将其实现委托给ServiceA 的实例。然后,您可以在需要实现IInterfaceB 的对象的地方使用包装类的实例。

例如:

class BAdapter : IInterfaceB
{
    private readonly ServiceA _serviceA;

    public BAdapter(ServiceA serviceA)
    {
        _serviceA = serviceA;
    }

    public IInterfaceB Do() { return _serviceA.Do(); }
}

您也可以在上面的示例中将_serviceA(以及构造函数参数)声明为dynamic,并获得相同的结果。

【讨论】:

    猜你喜欢
    • 2022-01-02
    • 1970-01-01
    • 1970-01-01
    • 2011-12-14
    • 1970-01-01
    • 2019-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多