gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 05:13:14 25 4
gpt4 key购买 nike

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

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com