根据c#中的输入获取具体类型的最简洁方法

时间:2014-07-17 06:03:16

标签: c# .net windows windows-services

我有一个方法如下,这是一个类似工厂的sorta,给定一个字符串类型,我返回一个实现IWorkerJob的具体类型。有没有更好/更清洁的方法来做这个比拥有60个这样的案例的switch语句,可能是某种查找?

private static IWorkerJob GetWorkerJob(string type)
    {
        switch (type)
        {
            case WorkerJobType.IMPORT_GOOGLE_JOB:
                return new ImportGoogleJob();
            case WorkerJobType.IMPORT_XYZ_JOB:
                return new ImportXyzJob();

            ....

            default:
                return null;
        }
    }

2 个答案:

答案 0 :(得分:0)

您可以将generic methodwhere T : new()约束一起使用where T : <interface name>,您可以阅读有关MSDN文章Constraints on Type Parameters的约束的更多信息

private static IWorkerJob GetWorkerJob<T>() where T:IWorkerJob, new()
{
    return new T();
}

答案 1 :(得分:0)

是的,创建一个映射Func的字典,然后用它来创建实例。

这样的事情:

private static readonly Dictionary<string, Func<IWorkerJob>> workerJobFactories = new Dictionary<string, Func<IWorkerJob>>
{
    {WorkerJobType.IMPORT_GOOGLE_JOB, () => new ImportGoogleJob()},
    {WorkerJobType.IMPORT_XYZ_JOB, () => new ImportXyzJob()}
    ...
};

private static IComparable GetWorkerJob(string type)
{
    Func<IWorkerJob> factory = null;
    if (workerJobFactories.TryGetValue(type, out factory))
    {
        return factory();
    }
    return null;
}

另外,我建议您为enum创建WorkerJobType,而不是使用字符串。