我需要能够在运行时加载两个共享未知类型的类,如下所示:
interface IProducer<out A>
{
public A CookOne();
}
interface IConsumer<in A>
{
public void EatOne(A food);
}
<编辑>
这里有两个示例类
class IntChef : IProducer<int>
{
private int _counter = 0;
public int CookOne()
{
return counter++;
}
}
class IntCustomer : IConsumer<int>
{
public void EatOne(int food)
{
Console.WriteLine("I ate a {0}", food);
}
}
目标是加载每个接口(interface)的实现,共享它们通过的通信类型,并创建一个不关心两个加载类型如何通信的新对象。
可能涉及的类型的完整列表在编译时无法获知,因为它们尚不存在。使用这些类型的软件是这样的:
interface IStrategyFactory<A>
{
public IStrategy MakeAStrategy(IProducer<A> producer, IConsumer<A> consumer);
}
interface IStrategy
{
public void DoSomething();;
}
我如何加载外部二进制代码(来自两个不同的来源)并以类型安全的方式将它们传递给工厂(或其他任何地方),这样我就不能,例如,传递一个 IProducer 和一个消费者?
到目前为止我能找到的最好的资源是 http://codebetter.com/blogs/glenn.block/archive/2009/08/20/open-generic-support-in-mef.aspx
程序本身最好有这样的类型:
interface IStrategyFactory<A>
{
public IStrategy MakeAStrategy(IProducer<A> producer, IConsumer<A> consumer);
}
interface IStrategy
{
public void DoSomething();;
}
最佳答案
您可以使用反射在运行时创建新对象,甚至是通用类。您可以创建一个类工厂,根据列出类型的配置文件加载它们。听起来您基本上是在寻找 IOC容器。这基本上就是 Windsor-Castle 的内容项目确实如此,并增加了一个漂亮的界面。这可能无法满足您的确切需求,但还有许多其他开源项目可能适合您。
我还建议您使用接口(interface)来定义要在 CookOne 和 EatOne 方法中使用的方法,并向 IProducer 和 IConsumer 接口(interface)添加通用约束。
interface ISomethingOrOther{}
interface IProducer<out A> where A : ISomethingOrOther
{
public A CookOne();
}
interface IConsumer<in A> where A : ISomethingOrOther
{
public void EatOne(A food);
}
关于generics - 如何从处理未知类型的多个来源安全地加载代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3433130/