有人可以解释以下代码中发生的事情:
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)
答案 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
的类型。