通用类型列表

22

我有一个通用类,想要创建一个该类的列表。然后在运行时获取该项的类型。

public class Job<T>
{
    public int ID { get; set; }
    public Task<T> Task { get; set; }
    public TimeSpan Interval { get; set; }
    public bool Repeat { get; set; }
    public DateTimeOffset NextExecutionTime { get; set; }

    public Job<T> RunOnceAt(DateTimeOffset executionTime)
    {
        NextExecutionTime = executionTime;
        Repeat = false;
        return this;
    }
}

我想要实现的目标

List<Job<T>> x = new List<Job<T>>();

public void Example()
{
    //Adding a job
    x.Add(new Job<string>());

    //The i want to retreive a job from the list and get it's type at run time
}
2个回答

39

如果您所有的工作都是相同类型的(例如Job<string>),那么您可以简单地创建该类型的列表:

List<Job<string>> x = new List<Job<string>>();
x.Add(new Job<string>());

然而,如果您想要在同一个列表中混合不同类型的作业(例如Job<string>Job<int>),则必须创建一个非泛型基类或接口:

public abstract class Job 
{
    // add whatever common, non-generic members you need here
}

public class Job<T> : Job 
{
    // add generic members here
}

然后您可以执行:

List<Job> x = new List<Job>();
x.Add(new Job<string>());

如果你想在运行时获取Job的类型,可以这样做:

Type jobType = x[0].GetType();                       // Job<string>
Type paramType = jobType .GetGenericArguments()[0];  // string

抱歉,您能否再解释一下,加上 { ... } 之后会变成什么? - Erric J Manderin
抽象类只是一个空类吗? - Erric J Manderin
1
@ErricJManderin 这将取决于您从JobJob<string>中需要什么,但是根据您的代码,似乎您可以在非泛型Job类中拥有除了TaskRunAtOnce之外的所有内容。 - p.s.w.g
好的,又有一个问题,抱歉 :D,当从列表中检索作业时,如何恢复其通用类型?换句话说,如何知道它是 Job<string> 还是 <int> 或其他类型? - Erric J Manderin
1
@ErricJManderin 这份工作永远不会失去它的类型,所以“恢复”它并没有什么意义。如果您需要访问一些通用成员,可以进行简单的转换:((Job<string>)job).Task - p.s.w.g
显示剩余3条评论

7
通过创建一个接口并在您的类中实现它,您将能够创建该接口类型的列表,并添加任何作业:
interface IJob
{
    //add some functionality if needed
}

public class Job<T> : IJob
{
    public int ID { get; set; }
    public Task<T> Task { get; set; }
    public TimeSpan Interval { get; set; }
    public bool Repeat { get; set; }
    public DateTimeOffset NextExecutionTime { get; set; }

    public Job<T> RunOnceAt(DateTimeOffset executionTime)
    {
        NextExecutionTime = executionTime;
        Repeat = false;
        return this;
    }
}

List<IJob> x = new List<IJob>();
x.Add(new Job<string>());

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接