使用泛型返回各种类型的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不能像这样转换为其他类型。
有谁知道我是怎么做到的吗
您似乎有点忽略了泛型的要点。如果你试图在一个泛型方法中处理多个特定类型,那通常意味着你走错了方向。
一个可能的解决方案是让你的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
}
}