2015-07-01 80 views
0

我很难在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类,如BaseConsumerDerivedConsumer。因此,我不应该明确指定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的基本类型,因为编译器正好可以当我使用ConsumerMiddleConsumer时,请看它。请注意,可能有几十个不同的Consumer类。

我的问题是:有没有办法让C#编译器从它的泛型参数中推断出MiddleConsumer的消耗类型?

谢谢你的帮助!

回答

0

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()); 
+0

显然这是唯一的方法 –