.net代码的说明

时间:2017-09-10 08:02:46

标签: c#

有人可以解释以下代码中发生的事情:

private IList<SomeModel> ImportSomething<T>(IEnumerable<ISomeInterface> someResponse, Func<ISomeInterface, Conversion<T>> converter) => someResponse
    .Select(converter)
    .Where(conversion => conversion.Status == ConversionStatus.Success)
    .Select(conversion => conversion.Object)
    .Cast<SomeModel>()
    .ToList();

上面的代码由:

调用
ImportSomething(collectionOfThings, _thingConverter.FromXmlResponse)

2 个答案:

答案 0 :(得分:1)

不是实际发生的事情,但逻辑思路是一样的。

var result = new List<SomeModel>();

foreach (var response in someResponse)
{
    // Select(converter)
    var conversion = converter(response);

    // Where(conversion => conversion.Status == ConversionStatus.Success)
    if (conversion.Status == ConversionStatus.Success)
    {
        // Select(conversion => conversion.Object)
        var value = conversion.Object;

       // Cast<SomeModel>()
        var model = (SomeModel)value;

        result.Add(model);
    }
}

return result;

答案 1 :(得分:1)

您有一个通用方法,其签名如下:

private IList<SomeModel> ImportSomething<T>(
    IEnumerable<ISomeInterface> someResponse
    , Func<ISomeInterface, Conversion<T>> converter)

此方法有两个参数。第一个是ISomeInterface个对象的序列。其中第二个是Func,它将实现接口ISomeInterface的对象作为输入,并返回类型为Conversion<T>的对象。本质上,它是将实现接口ISomeInterface的对象的输入转换为类型Conversion<T>的对象的方法。

然后对于给定的输入,表示为someResponse应用了一些转换。

首先,对于序列someResponse中的每个项目,都应用converter

someResponse.Select(converter)

这样,此序列中的所有ISomeInterface个对象都将转换为Conversion<T>类型的对象。

然后将过滤掉未能转换的项目,并使用已成功转换的对象创建新序列:

Where(conversion => conversion.Status == ConversionStatus.Success)

在此之后进行投影,并且从Conversion<T>对象获得Object属性:

Select(conversion => conversion.Object)

最后我们将序列中的每个项目转换为SomeModel对象,并通过调用ToList方法请求立即执行查询。

执行的查询的结果将是List<SomeModel>个对象。

如果你有一个具体的例子,上面的步骤可以更具体:

ImportSomething(collectionOfThings, _thingConverter.FromXmlResponse)

现在,将应用上述所有内容的对象序列是collectionOfThings对象,将使用的转换器是_thingConverter.FromXmlResponse。您不需要指定T,因为编译器可以将其推断为_thingConverter.FromXmlResponse的类型。