c# - List 的一般问题

标签 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 获取数据属性(property)。

问题就在这里ParallelRunner.Run(new List<ParallelFunction> { pf1, pf2 });如果 ParallelFunction 与泛型一起使用,我当然无法将两个不同的类型添加到列表中。

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

最佳答案

在泛型类型暴露给非泛型基础设施的情况下,我引入了一个非泛型接口(interface):

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

你看,我稍微更改了设计,以减少该类所做的工作。该接口(interface)可以公开非通用位“CacheResult”。您的 Helper 现在可以通过调用 Cacheresult 方法来关闭接口(interface)。在助手之外,您仍然可以拥有通用实现。

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

关于c# - List 的一般问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3856404/

相关文章:

c# - 如何将 .Net 中的 System.Decimal 四舍五入到一些有效数字

c# - C# 中的数字列表并获取最小值和最大值,而不保留上一个循环中存储的变量

c# - 是否需要同步 .NET SerialPort 写入/读取?

java - 如何处理 Java 方法中变量的类型泛型?

c# - SQLite 使用 sqlite-net 加入 Windows 8 Metro C#

c# - 如何使用 c# 驱动程序删除 mongodb 文档中的嵌套数组元素

.net - System.Collections - 为什么有这么多选项?

c# - 在产品属性选择更改时更改产品规范价格

java - 具有通配符类型的生产者方法

scala - 如何在 Scala 中为泛型类型提供默认类型类?