在dotnet核心中在运行时实现接口的最佳方法是什么?

时间:2017-07-07 02:30:54

标签: c# dynamic runtime .net-core reflection.emit

我想做这样的事情:

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

在我用Google搜索如何在c#的运行时实现界面后,大多数文章都是旧的。我想通过使用 lambda 动态但不能发出来解决这个问题。是否有这样的方法可以解决这个问题?

1 个答案:

答案 0 :(得分:3)

回答你的问题:

System.Reflection.Emit是执行您要求的正确方法。 dynamic和lambdas是C#语言的特性。换句话说,它们是编译器魔术,但在引擎盖下,它们用于在编译时生成中间语言(IL)。 System.Reflection.Emit是在运行时生成IL的最佳方法。

现在,猜猜我认为你想问的是什么:

那就是说,在上面的示例中,看起来你真正要求的是类型查找。 在运行时实现接口很困难,但从接口解析实现并不困难。

有六个依赖注入框架可以帮到你。例如,如果您使用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();
    }
}