试图了解泛型并希望创建一个返回各种类型记录的类。
所以我想要的是这样的:
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无法转换为其他类型。
有谁知道我怎么能达到这样的目的。
答案 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
}
}