generics - 如何从处理未知类型的多个来源安全地加载代码?

标签 generics c#-4.0 inversion-of-control mef

我需要能够在运行时加载两个共享未知类型的类,如下所示:

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/

相关文章:

swift - swift 中 any 类型和泛型类型的区别

c# - 继承泛型作为函数参数

java - 令人惊讶的 "inferred type does not conform to upper bound"错误

wpf - 在同一个控件 xaml 中访问依赖属性

c# - 如何基于同一个服务注册和解析多个组件

c# - 注入(inject)应用程序配置的最佳方式

c# - 将事件转换为任务的可重用模式

c# - 日期时间格式转换

c# - 为什么这段代码不终止进程?

java - 具有 Spring IoC 的 Null 内部 Bean