理解Func委托(lambda表达式)的列表
本文关键字:列表 表达式 lambda Func 委托 理解 | 更新日期: 2023-09-27 18:12:42
我开始使用lambda表达式,现在我经常使用它,但只使用简单的表达式:-(。有时,我真的很难理解现有代码库中的lambda表达式。努力理解下面的代码,但仍然无法完全破译:-(.我认为由于使用了Func委托,我无法理解。我知道当委托返回一些东西时会使用Func委托。但在这种情况下没有线索。
代码片段:
public class PrintProvider
{
private readonly IInstructionSheetViews _instructionSheetViews;
public PrintProvider(IInstructionSheetViews instructionSheetViews)
{
_instructionSheetViews = instructionSheetViews;
}
public void AddReport()
{
// Some implementation code goes here
var printViews = _instructionSheetViews.PrintViews;
// Some implementation code goes here
}
}
public class InstructionSheetViews : IInstructionSheetViews
{
private readonly IInstructionSheetFactory _factory;
private IEnumerable<IReport> _instructionSheetView;
private List<Func<IInstructionSheetFactory, IReport>> _instructionSheetViewList;
public InstructionSheetViews(IInstructionSheetFactory factory)
{
_factory = factory;
}
public IEnumerable<IReport> PrintViews
{
get
{
if (_instructionSheetView == null)
{
Init();
_instructionSheetView = _instructionSheetViewList.Select(x => x(_factory));
}
return _instructionSheetView;
}
}
private void Init()
{
_instructionSheetViewList = new List<Func<IInstructionSheetFactory, IReport>>();
_instructionSheetViewList.Add(x => x.BuildCommonData());
_instructionSheetViewList.Add(x => x.BuildSpecificData());
}
}
在上面的代码片段中,AddReport方法调用"_instructionSheetViews.PrintViews",而此方法inturn调用"Init(("。
Q1.这里的"_instructionSheetViewList"中到底添加了什么-
_instructionSheetViewList.Add(x => x.BuildCommonData());.
我可以猜测的是,它添加了一个返回"IReport"的方法。但是"_instructionSheetViewList"包含一个"Func"列表。那么,理想情况下,它不应该包含一个将输入作为"IInstructionSheetFactory"并返回"IReport"的方法吗?
Q2.这种说法是如何运作的。基本上是控制流程。
_instructionSheetViewList.Select(x => x(_factory));
有人能给我解释一下吗?
提前谢谢。
那么,理想情况下,它不应该包含一个将输入作为"IInstructionSheetFactory"并返回"IReport"的方法吗?
确实如此。_instructionSheetViewList.Add(x => x.BuildCommonData());
基本上等同于:
_instructionSheetViewList.Add(anonymousMethod12345);
/*...*/
public static IReport anonymousMethod12345 (IInstructionSheetFactory x)
{
return x.BuildCommonData();
}
_instructionSheetViewList.Add(x => x.BuildCommonData());
相当于-
private IReport GetReport(IInstructionSheetFactory x)
{
return x.BuildCommonData();
}
当你这样做的时候-
_instructionSheetViewList.Select(x => x(_factory));
它实际上调用了一个将Func作为该方法输入参数的方法inturn调用Func委托引用的方法,并将_factory作为输入参数
private IReport DoSomething(Func<IInstructionSheetFactory, IReport> x)
{
return x(_factory);
}
希望这能有所帮助。