List的一般问题

时间:2010-10-04 14:54:59

标签: c# .net generics

我正在尝试创建一个可以在ParallelRunner类中使用的并行助手类(RequestService):

public class ParallelFunction
{
    public ParallelFunction(Func<object> function)
    {
        Function = function;
    }

    public T GetResult<T>() where T : class
    {
        return (T) Data;
    }

    public Func<object> Function { get; private set; }
    public object Data { private get; set; }
}

public static class ParallelRunner
{
    public static void Run( IEnumerable<ParallelFunction> parallelFunctions)
    {
        Parallel.ForEach(parallelFunctions, f =>{f.Data = f.Function();});
    }
}


public class RequestService
{
    public void DoParallel()
    {
        var da = new RequestDataAccess();
        var pf1 = new ParallelFunction(da.GetRequests);
        var pf2 = new ParallelFunction(da.GetRequestAnswers);

        ParallelRunner.Run(new List<ParallelFunction> { pf1, pf2 });

        var requests = pf1.GetResult<List<Request>>();
        var answers = pf2.GetResult<List<RequestAnswer>>();
    }
}

我真正希望拥有的是类似的通用ParallelFunction类:

public class ParallelFunction<T>  where T : class
{
    public ParallelFunction(Func<T> function)
    {
        Function = function;
    }

    public Func<T> Function { get; private set; }
    public T Data { get; set; }
}

而不是从GetResult<T>获取所需类型的演员数据,而不是从T Data属性获取数据。

问题在于ParallelRunner.Run(new List<ParallelFunction> { pf1, pf2 });如果ParallelFunction与通用符号相同,我当然无法将不同的类型添加到列表中。

也许有人知道如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

使用IParallelFunc<out T>实现的变体通用接口ParallelFunc<T>。然后,IParallelFunc<int>IParallelFunc<string>都可以推广到IParallelFunc<object>并由您的方法处理。

答案 1 :(得分:1)

在泛型类型暴露给非泛型基础结构的情况下,我引入了一个非泛型的接口:

public class ParallelFunction<T> : IParallelFunction
{
    private readonly Func<T> function;

    public ParallelFunction(Func<T> function)
    {
        this.function = function;
    }

    public void CacheResult()
    {
        Data = function();
    }

    public T Data { get; private set; }
}

你看,我改变了设计,以减少课程所做的事情。该接口可以暴露非通用位“CacheResult”。您的Helper现在可以通过调用Cacheresult方法来处理接口。在帮助程序之外,您仍然可以使用通用实现。

public static class ParallelRunner
{
    public static void Run(IEnumerable<IParallelFunction> parallelFunctions)
    {
        Parallel.ForEach(parallelFunctions, f => f.CacheResult());
    }
}