使用泛型返回各种类型的List

本文关键字:类型 List 种类 泛型 返回 | 更新日期: 2023-09-27 18:19:19

试图让我的头围绕泛型,我想创建一个类,返回各种类型的记录。

所以我想要这样写:

public class Job
{
    public JobType Type { get; set; }
    public Job (JobType jobType)
    {
        Type = jobType;
    }
    public IList<T> GetRecords<T>()
    {
       IList<T> records = new IList<T>();
       if (Type == JobType.Type1)
       {
           List<Type1Record> records = GetType1Records();
       }
       if (Type == JobType.Type2)
       {
            List<Type2Record> records = GetType2Records();
       }
        return records;
    }
}

我想用类似

这样的方式来命名它
var job = new Job(JobType.Type1);
var jobRecords = Job.GetRecords();

我认为上面的代码传达了意图,但我开始认为我以错误的方式处理这个问题,因为上面根本不起作用。IList不能像这样转换为其他类型。

有谁知道我是怎么做到的吗

使用泛型返回各种类型的List

您似乎有点忽略了泛型的要点。如果你试图在一个泛型方法中处理多个特定类型,那通常意味着你走错了方向。

一个可能的解决方案是让你的Records继承一些共享基类:

public class Job
{
    public JobType Type { get; set; }
    public Job (JobType jobType)
    {
        Type = jobType;
    }
    // Type1Record and Type2Record both inherit from RecordBase
    public IEnumerable<RecordBase> GetRecords()
    {
       if (Type == JobType.Type1)
       {
           return GetType1Records();
       }
       if (Type == JobType.Type2)
       {
            return GetType2Records();
       }
       return null;
    }
}

请注意,这里需要返回IEnumerable<T>,而不是IList<T>,因为对IList<T>执行上述操作会破坏协方差。

看起来在类级别使用泛型可能会更好。

public abstract class Job<TRecord>
{
    public abstract IList<TRecord> GetRecords();
}
public class Type1Job : Job<Type1Record>
{
    public override IList<Type1Record> GetRecords()
    {
        // implementation
    }
}
public class Type2Job : Job<Type2Record>
{
    public override IList<Type2Record> GetRecords()
    {
        // implementation
    }
}