将接口映射到不实现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类的对象。

我听说企业库依赖注入可以帮助解决这个问题。但是我仍然不使用企业库。你能分享一下这个想法吗?

将接口映射到不实现c#接口的类(动态地)

您应该对很棒的临时接口库(可通过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的任何地方注入。

相关文章: