gpt4 book ai didi

c# - 我怎样才能清理这个丑陋的 if 语句?

转载 作者:行者123 更新时间:2023-11-30 13:12:43 26 4
gpt4 key购买 nike

我有以下丑陋的 if 语句,它是从 IOC 容器中提取的类的一部分:

protected virtual void ExecuteSourceControlGet(IBuildMetaData buildMetaData, IPackageTree componentTree)
{
if ((buildMetaData.RepositoryElementList != null) && (buildMetaData.RepositoryElementList.Count > 0))
{
componentTree.DeleteWorkingDirectory();

foreach (var repositoryElement in buildMetaData.RepositoryElementList)
{
repositoryElement.PrepareRepository(componentTree, get).Export();
}

}

if((buildMetaData.ExportList != null) && (buildMetaData.ExportList.Count > 0))
{
var initialise = true;

foreach (var sourceControl in buildMetaData.ExportList)
{
log.InfoFormat("\nHorn is fetching {0}.\n\n".ToUpper(), sourceControl.Url);

get.From(sourceControl).ExportTo(componentTree, sourceControl.ExportPath, initialise);

initialise = false;
}

}

log.InfoFormat("\nHorn is fetching {0}.\n\n".ToUpper(), buildMetaData.SourceControl.Url);

get.From(buildMetaData.SourceControl).ExportTo(componentTree);
}

我消除 if 语句的通常方法是为每个条件创建一个子类。

这个例子的不同之处在于:

  1. 具有此方法的类是从 IOC 容器中提取的。
  2. 我可能希望 2 个 if 语句之间的逻辑运行或根本不运行。

非常欢迎任何建议。

最佳答案

我不太确定您为什么要消除 if 语句 - 并且使用继承似乎有点过头了。您可能想为重复的收集代码创建一个扩展方法:

public static bool HasElements<T>(this ICollection<T> collection)
{
return collection != null && collection.Count != 0;
}

这让您可以将条件更改为:

if (buildMetaData.RepositoryElementList.HasElements())

if (buildMetaData.ExportList.HasElements())

IMO 稍微简单一些。如果最终有更多的逻辑,您可能还想将这两个 block 分成不同的方法。除此之外,我不会担心。

哦,还有另一种扩展方法,如果你需要关心你是否有元素,它不会有帮助,但如果你只想做一个 null-safe foreach,它会有所帮助:

public static IEnumerable<T> EmptyIfNull<T>(this IEnumerable<T> source)
{
return source ?? Enumerable.Empty<T>();
}

(并不是说它比使用内联空合并运算符节省很多,诚然...)

关于c# - 我怎样才能清理这个丑陋的 if 语句?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1054426/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com