我很难在C#中遇到问题。访问泛型参数的泛型参数?
在我正在研究的项目中,有一些存储信息的类consumable
,有consumer
类使用这些消耗类。
我复制了一个更简单的方法了这样的事:
using System;
using System.Collections.Generic;
interface IBase
{
int x {get;}
}
class BaseClass : IBase
{
public int x {get; set;}
}
interface IDerived : IBase
{
int y {get;}
}
class DerivedClass : BaseClass, IDerived
{
public int y {get; set;}
}
interface IConsumer<in T> where T: class, IBase
{
void Feed(T arg);
}
class BaseConsumer : IConsumer<IBase>
{
public void Feed(IBase arg)
{
Console.WriteLine(arg.x);
}
}
class DerivedConsumer : IConsumer<IDerived>
{
public void Feed(IDerived arg)
{
Console.WriteLine(arg.y);
}
}
public class Program
{
public static void Main()
{
List<IConsumer<IDerived>> consumers = new List<IConsumer<IDerived>>();
consumers.Add(new BaseConsumer());
consumers.Add(new DerivedConsumer());
DerivedClass d = new DerivedClass() { x = 3, y = 5};
foreach (IConsumer<IDerived> consumer in consumers)
consumer.Feed(d);
}
}
这工作完全正常。但是,我也想要一些middle
使用者,它在构造函数(或其他方法)中将另一个consumer
对象,将Feed调用重定向到对象。例如:
class MiddleConsumer<T> : IConsumer<T> where T : class, IBase
{
private IConsumer<T> _consumer;
public MiddleConsumer(IConsumer<T> consumer)
{
_consumer = consumer;
}
public void Feed(T arg)
{
_consumer.Feed(arg);
}
}
而且我会使用这样的:
consumers.Add(new MiddleConsumer<IBase>(new BaseConsumer());
consumers.Add(new MiddleConsumer<IDerived>(new DerivedConsumer());
但我将使用MiddleConsumer
与其他混凝土Consumer
类,如BaseConsumer
和DerivedConsumer
。因此,我不应该明确指定T
参数,它只能从实际的Consumer
s类型中获取它。让我澄清一下。我想有这样的事情:(注意,这不是有效的C#代码)
class MiddleConsumer<IConsumer<T>> : IConsumer<T>
{
private IConsumer<T> _consumer;
public MiddleConsumer(IConsumer<T> consumer)
{
_consumer = consumer;
}
public void Feed(IDerived arg)
{
_consumer.Feed(arg);
}
}
然而, - 作为expected-这不起作用由于具有怪异的泛型参数。
我想能够创建一个消费者MiddleConsumer对象,我不知道它的基类型。我的意思是,我希望能够做到这一点:
consumers.Add(new MiddleConsumer<BaseConsumer>(new BaseConsumer());
consumers.Add(new MiddleConsumer<DerivedConsumer>(new DerivedConsumer());
我不想签我想与MiddleConsumer
用的时候 - 对于例 - BaseConsumer
的基本类型,因为编译器正好可以当我使用Consumer
和MiddleConsumer
时,请看它。请注意,可能有几十个不同的Consumer
类。
我的问题是:有没有办法让C#编译器从它的泛型参数中推断出MiddleConsumer
的消耗类型?
谢谢你的帮助!
显然这是唯一的方法 –