[英]Accessing the generic parameter of generic parameter?
我在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
的类型中获取即可。 让我澄清一下。 我想要这样的东西:(请注意,这不是有效的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);
}
}
但是,-如预期的那样-由于具有奇怪的通用参数,因此无法正常工作。
我希望能够使用不知道其基本类型的Consumer创建MiddleConsumer对象。 我的意思是,我希望能够做到这一点:
consumers.Add(new MiddleConsumer<BaseConsumer>(new BaseConsumer());
consumers.Add(new MiddleConsumer<DerivedConsumer>(new DerivedConsumer());
我不想每次都与MiddleConsumer
一起使用时都要检查例如BaseConsumer
的基本类型,因为当我将Consumer
与MiddleConsumer
一起使用时,编译器只能查看它。 注意,可能有数十种不同的Consumer
类。
我的问题是: 有没有办法让C#编译器从其通用参数推断MiddleConsumer
的消耗类型?
谢谢您的帮助!
C#不支持构造函数的类型推断,但是您可以做的是通过静态方法将调用委托给构造函数:
public static class MiddleConsumer
{
public static MiddleConsumer<T> Create<T>( IConsumer<T> consumer ) where T : class, IBase
{
return new MiddleConsumer<T>( consumer );
}
}
现在,您完全不需要指定通用参数:
consumers.Add(MiddleConsumer.Create(new BaseConsumer());
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.