C# 访问泛型参数的泛型参数?

C# 访问泛型参数的泛型参数?,c#,generics,type-inference,generic-variance,C#,Generics,Type Inference,Generic Variance,我在C语言中遇到了一个难题 在我正在工作的项目中,有一些存储信息的消耗品类,还有一些使用这些消耗品类的消费者类 我用一种更简单的方式复制了这件事: using System; using System.Collections.Generic; interface IBase { int x {get;} } class BaseClass : IBase { public int x {get; set;} } interface IDerived : IBase {

我在C语言中遇到了一个难题

在我正在工作的项目中,有一些存储信息的消耗品类,还有一些使用这些消耗品类的消费者类

我用一种更简单的方式复制了这件事:

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);
    }
}
consumers.Add(new MiddleConsumer<IBase>(new BaseConsumer());
consumers.Add(new MiddleConsumer<IDerived>(new DerivedConsumer());
我会这样使用它:

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);
    }
}
consumers.Add(new MiddleConsumer<IBase>(new BaseConsumer());
consumers.Add(new MiddleConsumer<IDerived>(new DerivedConsumer());
然而,正如预期的那样,由于有一个奇怪的泛型参数,这不起作用

我希望能够创建一个MiddleConsumer对象,该对象的使用者我不知道其基本类型。我的意思是,我希望能够做到这一点:

consumers.Add(new MiddleConsumer<BaseConsumer>(new BaseConsumer());
consumers.Add(new MiddleConsumer<DerivedConsumer>(new DerivedConsumer());
我不想每次我想在MiddleConsumer中使用它时都检查-例如-BaseConsumer的基类型,因为当我在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());