首页 > 解决方案 > 如何解决 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)':并非所有代码路径都返回值

标签: c#episerver

解决方案


    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”


推荐阅读