18

ジェネリック クラスがあり、そのリストを作成したいと考えています。そして、実行時にアイテムのタイプを取得します

クラス

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
}
4

2 に答える 2

34

すべてのジョブが同じタイプ (例: 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実行時に a の型を取得したい場合は、次のようにします。

Type jobType = x[0].GetType();                       // Job<string>
Type paramType = jobType .GetGenericArguments()[0];  // string
于 2013-07-30T22:57:05.740 に答える
6

インターフェイスを作成してクラスに実装することで、そのインターフェイス タイプのリストを作成し、任意のジョブを追加できます。

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>());
于 2013-07-30T23:22:54.863 に答える