Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Generics 如何从处理未知类型的多个源安全地输入和加载代码?_Generics_C# 4.0_Inversion Of Control_Mef - Fatal编程技术网

Generics 如何从处理未知类型的多个源安全地输入和加载代码?

Generics 如何从处理未知类型的多个源安全地输入和加载代码?,generics,c#-4.0,inversion-of-control,mef,Generics,C# 4.0,Inversion Of Control,Mef,我需要能够在运行时加载两个共享未知类型的类,如下所示: interface IProducer<out A> { public A CookOne(); } interface IConsumer<in A> { public void EatOne(A food); } interface IStrategyFactory<A> { public IStrategy MakeAStrategy(IProducer<A>

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

interface IProducer<out A>
{
    public A CookOne();
}

interface IConsumer<in A>
{
    public void EatOne(A food);
}
interface IStrategyFactory<A>
{
    public IStrategy MakeAStrategy(IProducer<A> producer, IConsumer<A> consumer);
}

interface IStrategy
{
    public void DoSomething();;
}
interface IStrategyFactory<A>
{
    public IStrategy MakeAStrategy(IProducer<A> producer, IConsumer<A> consumer);
}

interface IStrategy
{
    public void DoSomething();;
}
接口IProducer
{
公共的,公共的;
}
界面消费者
{
公共食品;
}
下面是两个示例类

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);
    }
}
class IntChef:IProducer
{
专用int_计数器=0;
公共电话号码
{
返回计数器++;
}
}
类别IntCustomer:IConsumer
{
公共空吃通(国际食品)
{
WriteLine(“我吃了一个{0}”,食物);
}
}
目标是加载每个接口的一个实现,共享它们通过的通信类型,并创建一个新对象,而不关心两个加载的类型如何通信

编译时无法知道可能涉及的所有类型,因为它们还不存在。使用这些类型的软件如下所示:

interface IProducer<out A>
{
    public A CookOne();
}

interface IConsumer<in A>
{
    public void EatOne(A food);
}
interface IStrategyFactory<A>
{
    public IStrategy MakeAStrategy(IProducer<A> producer, IConsumer<A> consumer);
}

interface IStrategy
{
    public void DoSomething();;
}
interface IStrategyFactory<A>
{
    public IStrategy MakeAStrategy(IProducer<A> producer, IConsumer<A> consumer);
}

interface IStrategy
{
    public void DoSomething();;
}
接口是策略工厂

程序本身的最佳类型如下:

interface IProducer<out A>
{
    public A CookOne();
}

interface IConsumer<in A>
{
    public void EatOne(A food);
}
interface IStrategyFactory<A>
{
    public IStrategy MakeAStrategy(IProducer<A> producer, IConsumer<A> consumer);
}

interface IStrategy
{
    public void DoSomething();;
}
interface IStrategyFactory<A>
{
    public IStrategy MakeAStrategy(IProducer<A> producer, IConsumer<A> consumer);
}

interface IStrategy
{
    public void DoSomething();;
}
接口是策略工厂
{
公共信息战略制定策略(生产者、消费者);
}
界面策略
{
公共空间;公共空间;;
}

您可以在运行时使用反射创建新对象,甚至是泛型类。您可以创建一个类工厂,根据列出类型的配置文件加载它们。听起来你基本上是在找一个容器。这基本上就是项目所做的,添加了一个漂亮的界面。这可能不适合您的确切需求,但还有许多其他开源项目可能适合您

我还建议您使用接口来定义要在CookOne和EatOne方法中使用的方法,并向IProducer和IConsumer接口添加通用约束

interface ISomethingOrOther{}

interface IProducer<out A> where A : ISomethingOrOther
{
    public A CookOne();
}

interface IConsumer<in A> where A : ISomethingOrOther
{
    public void EatOne(A food);
}
interface ISomethingOrOther{}
接口IProducer,其中A:IsomethingRother
{
公共的,公共的;
}
接口IConsumer,其中A:IsomethingRother
{
公共食品;
}