使用泛型返回各种类型的列表

时间:2015-10-25 13:32:14

标签: c# generics design-patterns

试图了解泛型并希望创建一个返回各种类型记录的类。

所以我想要的是这样的:

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无法转换为其他类型。

有谁知道我怎么能达到这样的目的。

1 个答案:

答案 0 :(得分:1)

你似乎有点遗漏了仿制药的观点。如果你试图在泛型方法中处理多种特定类型,那通常意味着你的方向错误。

您的问题的一个可能解决方案是让您的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
    }
}
相关问题