将接口映射到不实现c#接口的类(动态地)
本文关键字:接口 动态 映射 实现 | 更新日期: 2023-09-27 18:11:12
这是我在Stackoverflow上的第一篇文章。感谢Stackoverflow。
我的问题:
在类库中有一个接口。
namespace TestClient
{
public interface IMobileStore
{
List<string> GetMobileDetails();
int AddMobile(string mobile);
}
}
我在另一个类库中有一个名为MobileLibrary的类,并实现了IMobileStore接口(在开发时)
namespace MobileLibrary
{
public class MobileLibrary : IMobileStore
{
List<string> GetMobileDetails()
{
return new List<string>();
}
int AddMobile(string mobile)
{
return 1;
}
}
}
并在控制台应用程序中消费MobileLibrary库并使用。
但现在我想使用IndianMobileLibrary(这是具有相同的结构的MobileLibrary类如下,但它不实现接口),而不是MobileLibrary
注意:IndianMobileLibrary在另一个类库中可用(对这个库没有任何控制-第三方库)
namespace IndianMobileLibrary
{
public class IndianMobileLibrary //(doesn't implement the interface)
{
List<string> GetMobileDetails()
{
return new List<string>();
}
int AddMobile(string mobile)
{
return 1;
}
}
}
这里如何将IMobileStore动态映射到IndianMobileLibrary(作为实现),并动态地为IMobileStore创建实现IndianMobileLibrary类的对象。
我听说企业库依赖注入可以帮助解决这个问题。但是我仍然不使用企业库。你能分享一下这个想法吗?
您应该对很棒的临时接口库(可通过nuget获得)感兴趣。在它的帮助下,您可以简单地执行如下魔术:
var indian = new IndianMobileLibrary();
IMobileStore iface = indian.ActLike<IMobileStore>();
var mobile = iface.AddMobile("test");
当然,您对ActLike
返回对象具有完全的智能感知支持。这样做的另一个神奇的优点是,您根本不需要知道indian
的类型。
最简单的解决方案是用简单的"代理"样式包装不实现接口的类,只是一个适配器:
public class MyIndianMobileLibrary:IMobileStore
{
public MyIndianMobileLibrary(IndianMobileLibrary indian){
_indianMobileLibrary = indian;
}
IndianMobileLibrary _indianMobileLibrary;
public List<string> GetMobileDetails()
{
return indian.GetMobileDetails();
}
public int AddMobile(string mobile)
{
return indian.AddMobile(mobile);
}
}
public class IndianMobileLibrary //(doesn't implement the interface)
{
public List<string> GetMobileDetails()
{
return new List<string>();
}
public int AddMobile(string mobile)
{
return 1;
}
}
编辑
解决方案很简单,但没有必要,也许这个工作:
public class MyIndianMobileLibrary:IndianMobileLibrary,IMobileStore
{
public MyIndianMobileLibrary(){
}
public List<string> GetMobileDetails()
{
return base.GetMobileDetails();
}
public int AddMobile(string mobile)
{
return base.AddMobile(mobile);
}
}
最直接的方法是创建一个IndianMobileLibrary
功能的代理。您可以创建一个代理类,实现IMobileInterface
,但使用IndianMobileLibrary
实现。
使用IndianMobileLibrary;
namespace MyIndianMobileLibrary
{
public class MyIndianMobileLibraryImpl : IMobileStore
{
List<string> GetMobileDetails()
{
return new IndianMobileLibrary.GetMobileDetails();
}
int AddMobile(string mobile)
{
return 1;
}
}
现在你有了一个可编译的类来实现你的逻辑,并且可以在调用IMobileStore的任何地方注入。