将接口映射到Class(动态),但不实现接口C#

时间:2014-07-01 19:47:44

标签: c# interface automapping

这是我在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(作为实现),并动态创建实现IndianMobileLibrary类的IMobileStore的对象。

正如我所听到的,企业库依赖注入将有助于此。但我仍然使用企业库。请你分享这个想法。

3 个答案:

答案 0 :(得分:2)

你应该对伟大的impromptu interface库感兴趣(可通过nuget获得)。在它的帮助下,你可以简单地做一个魔术:

var indian = new IndianMobileLibrary();
IMobileStore iface = indian.ActLike<IMobileStore>();
var mobile = iface.AddMobile("test");

当然,您对ActLike返回的对象有完整的智能感知支持。另一个神奇的优点是你根本不必知道indian的类型。

答案 1 :(得分:1)

最简单的解决方案是以简单的“代理”时尚风格包装未实现接口的类,只需一个适配器:

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);
         }
     }

答案 2 :(得分:0)

最简单的方法是创建IndianMobileLibrary功能的代理。您可以创建一个实现IMobileInterface但使用IndianMobileLibrary实现的代理类。

使用IndianMobileLibrary;

namespace MyIndianMobileLibrary 
{
    public class MyIndianMobileLibraryImpl : IMobileStore
    {
        List<string> GetMobileDetails()
        {
             return new IndianMobileLibrary.GetMobileDetails();
        }

        int AddMobile(string mobile)
        {
             return 1;
        }
}

现在你有一个可编译的类来实现你的逻辑,并且可以在调用IMobileStore的任何地方注入。