2017-07-07 75 views
0

我想做的事情是這樣的:我用Google搜索在dotnet核心的運行時實現接口的最佳方式是什麼?

interface IMyInterface 
    { 
     void DoSomething(); 
     string SaySomeWords(IEnumerable<string> words); 
    } 

    public class InterfaceImplFactory 
    { 
     public void RegisterInterface(Type type) 
     { 
      throw new NotImplementedException(); 
     } 

     public InterfaceType GetInterfaceImpl<InterfaceType>() 
     { 
      throw new NotImplementedException(); 
     } 
    } 

    class Program 
    { 
     static void Main(string[] args) 
     { 
      var factory = new InterfaceImplFactory(); 
      factory.RegisterInterface(typeof(IMyInterface)); 

      var impl = factory.GetInterfaceImpl<IMyInterface>(); 

      impl.DoSomething(); 
      impl.SaySomeWords(new List<string>() { "HelloWorld", "thanks"}); 

      Console.ReadKey(); 
     } 
    } 

後如何在C#運行時實現一個接口,大部分文章都老了。我想通過使用lambda,dynamic但不排放來解決這個問題。有沒有像這樣的方法來解決這個問題?

回答

3

你作答問:

System.Reflection.Emit是做你所要求的正確方法。 dynamic和lambdas是C#語言功能。換句話說,它們是編譯器的魔力,但在引擎蓋下,它們被用來在編譯時產生中間語言(IL)。 System.Reflection.Emit是在運行時產生IL的最佳方法。現在

,在什麼我想你的意思是問猜測:

這就是說,你的樣品在上面,就好像你真的要求要爲TYPE-查找。 實現運行時的接口很困難,但從接口解析實現並不困難。

有六種依賴注入框架可以幫你做到這一點。例如,如果您要使用Microsoft.Extensions.DependencyInjection,則代碼可能如下所示。

using Microsoft.Extensions.DependencyInjection; 

interface IMyInterface 
{ 
    void DoSomething(); 
} 

class MyImplementation : IMyInterface 
{ 
    public void DoSomething() 
    { 
     // implementation here 
    } 
} 

class Program 
{ 
    public static void Main() 
    { 
     var services = new ServiceCollection() 
      .AddSingleton<IMyInterface, MyImplementation>() 
      .BuildServiceProvider(); 

     IMyInterface impl = services.GetRequiredService<IMyInterface>(); 
     impl.DoSomething(); 
    } 
} 
+0

感謝您的回覆,我貼了另一個問題更detailly [這裏](https://stackoverflow.com/questions/44993532/signature-of-the-body-and-declaration-in-a-method - 實施-DO-不匹配) –

相關問題