我想做这样的事情:
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 ,动态但不能发出来解决这个问题。是否有这样的方法可以解决这个问题?
答案 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();
}
}