c# - 如何解决 EpiServer 的 C# Helper 中的“并非所有代码路径都返回值”
问题描述
我有一个帮助类,在我们向实例添加额外站点之前,它在 EpiServer 中运行良好。现在我们已经添加了一个额外的站点,帮助器抛出一个空引用,因为新的Startpage
没有任何InsightsConfiguration.CoreStoriesConfig.CoreStories
.
我试图重写下面的代码来解释这个空引用:
using EPiServer;
using EPiServer.Shell.ObjectEditing;
using EPiServer.Web;
using System.Collections.Generic;
namespace Digital.Site.Helpers.Selections
{
public class DataLayerCoreStorySelectionFactory : ISelectionFactory
{
public IEnumerable<ISelectItem> GetSelections(ExtendedMetadata metadata)
{
var loader = EPiServer.ServiceLocation.ServiceLocator.Current.GetInstance<IContentLoader>();
var startPage = loader.Get<Models.Pages.StartPage>(SiteDefinition.Current.StartPage);
var coreStories = startPage.InsightsConfiguration.CoreStoriesConfig.CoreStories;
ISelectItem[] selectItems = new ISelectItem[coreStories.Count];
int i = 0;
foreach (var story in coreStories) {
selectItems[i++] = new SelectItem() { Text = story, Value = story};
}
return selectItems;
}
}
}
我尝试了以下方法:
using EPiServer;
using EPiServer.Shell.ObjectEditing;
using EPiServer.Web;
using System;
using System.Collections.Generic;
namespace Digital.Site.Helpers.Selections
{
public class DataLayerCoreStorySelectionFactory : ISelectionFactory
{
public IEnumerable<ISelectItem> GetSelections(ExtendedMetadata metadata)
{
var loader = EPiServer.ServiceLocation.ServiceLocator.Current.GetInstance<IContentLoader>();
var startPage = loader.Get<Models.Pages.StartPage>(SiteDefinition.Current.StartPage);
if (startPage.InsightsConfiguration.CoreStoriesConfig.CoreStories != null)
{
var coreStories = startPage.InsightsConfiguration.CoreStoriesConfig.CoreStories;
ISelectItem[] selectItems = new ISelectItem[coreStories.Count];
int i = 0;
foreach (var story in coreStories)
{
selectItems[i++] = new SelectItem() { Text = story, Value = story };
}
return selectItems;
}
}
}
}
但这会引发以下错误,我不确定如何解决:
'DataLayerCoreStorySelectionFactory.GetSelections(ExtendedMetadata)':并非所有代码路径都返回值
解决方案
public IEnumerable<ISelectItem> GetSelections(ExtendedMetadata metadata)
{
var loader = EPiServer.ServiceLocation.ServiceLocator.Current.GetInstance<IContentLoader>();
var startPage = loader.Get<Models.Pages.StartPage>(SiteDefinition.Current.StartPage);
if (startPage.InsightsConfiguration.CoreStoriesConfig.CoreStories != null)
{
var coreStories = startPage.InsightsConfiguration.CoreStoriesConfig.CoreStories;
ISelectItem[] selectItems = new ISelectItem[coreStories.Count];
int i = 0;
foreach (var story in coreStories)
{
selectItems[i++] = new SelectItem() { Text = story, Value = story };
}
return selectItems; // first code path
}
// return null; // second path
throw new CustomException("CoreStories is null"); // if you expect it in the if
}
该错误基本上说的是您的代码有多个路径。在你的情况下,你用 if 分叉了路径。想象一下当条件解析为假时会发生什么,在这种情况下应该返回什么?并且说“这不会发生”是不正确的,因为在这种情况下您不需要 if 。
每个 if 都有一个你可以写的显式 else,或者当条件解析为 false 时发生的隐式“else”
推荐阅读
- python - 计算时间列值变化
- git - 将 react 客户端推送到 repo
- c++ - 什么是编译器诊断?
- arrays - 如何检查 JSON 对象数组的每一项是否具有特定值?
- c# - 社交登录子域
- javascript - 在我分别到达最后一张和第一张幻灯片后,如何使下一个按钮和上一个按钮不起作用?
- javascript - 循环内的返回语句(算法脚本)
- flutter - NumerFormat 不允许我添加“,”
- ruby-on-rails - 如何根据 Rails 应用程序中的视图生成 PDF
- c# - 如何从命令行使用 Visual Studio for Mac 的自定义库部署我的 cli 程序?