将项目添加到通用列表时出现问题

时间:2019-04-17 08:23:02

标签: c# .net generics

我有以下界面

id_epis_triage all_descriptions
          2134 85              
          2137 98              

ClassA是一个通用类,但是T应该实现IInterface

public interface IInterface
{
    int GetId();
}

ClassB实现IInterface

public class ClassA<T> where T : IInterface {

}

ClassC是我的问题所在,即将项目添加到列表中。

public class ClassB : IInterface {
    public int GetId() {
        return 1;
    }
}

上面的代码给出了以下有意义的错误

public class ClassC {
    List<ClassA<IInterface>> list = new List<ClassA<IInterface>>();    

    public void Add<T>(ClassA<T> item) where T : IInterface {
        list.Add(item);
    }
}

问题的核心是在Add()方法中,我的目标是能够添加任何类型的ClassA。我不确定如何设计它以实现以下

cannot convert from 'Program.ClassA<T>' to'Program.ClassA<Program.IInterface>'

有什么想法吗?

2 个答案:

答案 0 :(得分:3)

使用协变泛型类型参数怎么样?

public interface IInterface
{
    int GetId();
}

// Contra-variant and covariant generic type argument can be used only in interfaces and delegates
public interface IClassA<out T> where T : IInterface 
{
}

public class ClassA<T> : IClassA<IInterface> where T : IInterface { }

public class ClassB : IInterface
{
    public int GetId()
    {
        return 1;
    }
}

public class ClassC
{
    List<IClassA<IInterface>> list = new List<IClassA<IInterface>>();

    public void Add(IClassA<IInterface> item)
    {
        list.Add(item);
    }
}
public class Test
{
    public static void Run()
    {
        ClassC classC = new ClassC();
        ClassA<ClassB> classA = new ClassA<ClassB>();
        classC.Add(classA);
    }
}

答案 1 :(得分:0)

根据设计的具体情况,您可以将ClassA分为两部分:

public abstract class ClassA {
  //Stuff that only works in terms of IInterface,
  //maybe with some abstract methods, required constructors, etc
}
public class ClassA<T> : ClassA where T : IInterface {
  //Stuff specific to T
}

然后,您将ClassA存储在列表中,并将它们转换为已知的具体类型,作为/当您知道这是什么并且需要以这些方式工作时(例如,能够呼叫ClassA<T>特定功能)