将 class 转换为可能的接口
Convert a class to a possible interface
我在不同的项目中有两个接口(这些项目没有相互引用),它们具有相同的方法,如下所示:
在第一个项目中我们有:
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 进行开发时访问它的方法。
如果我正确理解了你更新后的问题,那么 ServiceA
class 实现 IInterfaceA
的事实与问题无关(你甚至不知道实现的成员)。
就您似乎要问的问题而言 — 是否可以将 ServiceA
的实例视为 IInterfaceB
的实现实例 — 该问题的答案是 "no".
但是,您可以通过至少以下两种方式之一来估算该结果:
- 使用
dynamic
类型。在这里,对象不会显示为 IInterfaceB
,但您至少可以通过类型为 dynamic
. 的变量调用 Do()
方法
- 将
ServiceA
的实例包装在适配器 class 中,它实现 IInterfaceB
,并将其实现委托给 ServiceA
的实例。然后,您可以在需要实现 IInterfaceB
. 的对象的地方使用包装器 class 的实例
例如:
class BAdapter : IInterfaceB
{
private readonly ServiceA _serviceA;
public BAdapter(ServiceA serviceA)
{
_serviceA = serviceA;
}
public IInterfaceB Do() { return _serviceA.Do(); }
}
您也可以在上面的示例中将 _serviceA
(以及构造函数参数)声明为 dynamic
,并获得相同的结果。
我在不同的项目中有两个接口(这些项目没有相互引用),它们具有相同的方法,如下所示:
在第一个项目中我们有:
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 进行开发时访问它的方法。
如果我正确理解了你更新后的问题,那么 ServiceA
class 实现 IInterfaceA
的事实与问题无关(你甚至不知道实现的成员)。
就您似乎要问的问题而言 — 是否可以将 ServiceA
的实例视为 IInterfaceB
的实现实例 — 该问题的答案是 "no".
但是,您可以通过至少以下两种方式之一来估算该结果:
- 使用
dynamic
类型。在这里,对象不会显示为IInterfaceB
,但您至少可以通过类型为dynamic
. 的变量调用 - 将
ServiceA
的实例包装在适配器 class 中,它实现IInterfaceB
,并将其实现委托给ServiceA
的实例。然后,您可以在需要实现IInterfaceB
. 的对象的地方使用包装器 class 的实例
Do()
方法
例如:
class BAdapter : IInterfaceB
{
private readonly ServiceA _serviceA;
public BAdapter(ServiceA serviceA)
{
_serviceA = serviceA;
}
public IInterfaceB Do() { return _serviceA.Do(); }
}
您也可以在上面的示例中将 _serviceA
(以及构造函数参数)声明为 dynamic
,并获得相同的结果。