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
{
公共食品;
}