IEnumerable返回路径

时间:2014-08-12 09:00:42

标签: c# asp.net

处理返回路径的最佳方法是什么?编译器说并不是所有的路径都返回一个类型,即使我在我的switch语句中做了但是导致我返回一个通用的IEnumerable,这是我处理下面的最佳方式?。

有关如何处理查询的任何建议,因为我不知道为什么我需要这样做三次?。

    public IEnumerable<Object> GetMenuItemsFromLevel(ReturnMenuType returnType)
    {
        IEnumerable<menu_top_level> menuTop = from m in db.menu_top_level
                                      where m.top_level_visible =="Yes"                                  
                                              select m;


        IEnumerable<menu_mid_level> menuMid = from m in db.menu_mid_level
                                              where m.mid_level_visible== "Yes"
                                            select m;



        IEnumerable<menu_bot_level> menubottom = from m in db.menu_bot_level
                                              where m.bot_level_visible == "Yes"
                                              select m;

        // Switch on the Priority enum.
        switch (returnType)
        {
            case ReturnMenuType.TopLevel:
                return menuTop;
            case ReturnMenuType.MidLevel:
                return menuMid;
            case ReturnMenuType.BottomLevel:
                return menubottom;



        }


    }

6 个答案:

答案 0 :(得分:3)

在开关结束时添加默认值:

switch (returnType)
    {
        case ReturnMenuType.TopLevel:
            return menuTop;
        case ReturnMenuType.MidLevel:
            return menuMid;
        case ReturnMenuType.BottomLevel:
            return menubottom;

        default:
            return something

答案 1 :(得分:0)

交换机需要默认值。可以输入3个值的NEITHER值。

答案 2 :(得分:0)

默认:   返回新的List();

但你不应该这样做。

  1. 所有linq语句都会被评估,即使您只需要一个。
  2. 键入了返回的IEnumerable,但方法返回类型为IEnumerable<object>

答案 3 :(得分:0)

如果你不能返回&#34;默认&#34;价值,也许最好抛出异常。

   // Switch on the Priority enum.
    switch (returnType)
    {
        case ReturnMenuType.TopLevel:
            return menuTop;
        case ReturnMenuType.MidLevel:
            return menuMid;
        case ReturnMenuType.BottomLevel:
            return menubottom;
        default:
            throw new NotImplementedException(); 
            // throw NotSupportedException();
    }

答案 4 :(得分:0)

您的每个菜单对象的类型完全不同(menu_top_levelmenu_mid_level等等,这很奇怪。您应该尝试使用多态并使用以下内容提取常见的接口:

interface IMenu
{
    // if it's a menu, then it has a 'Visible' property
    bool Visible { get; }
}

class ParentClass
{
    public IEnumerable<IMenu> TopLevelMenu { get; }
    public IEnumerable<IMenu> MidLevelMenu { get; }
    public IEnumerable<IMenu> BottomLevelMenu { get; }
}

获取所有可见项目现在变得微不足道了:

public IEnumerable<IMenu> GetVisibleMenus(IEnumerable<IMenu> menu)
{
    return menu.Where(m => m.Visible);
}

你完全失去了那些类似的LINQ查询:

public IEnumerable<IMenu> GetVisibleMenusForLevel(ReturnMenuType returnType)
{
    if (returnType == ReturnMenuType.TopLevel)
        return GetVisibleMenus(db.TopLevelMenu);

    if (returnType == ReturnMenuType.MidLevel)
        return GetVisibleMenus(db.MidLevelMenu);

    // otherwise return the bottom menu
    return GetVisibleMenus(db.BottomLevelMenu);
}

此外,您正在使用&#34;类型代码&#34; (在这种情况下为ReturnMenuType)也是关于OOP实践的代码味道。通过让父类将所有级别存储在单个字典集合中,您可以使其更简单,例如:

class ParentClass
{
    private Dictionary<ReturnMenuType, List<IMenu>> _menuItems = InitMenuItems();

    private static Dictionary<ReturnMenuType, List<IMenu>> InitMenuItems()
    {
        return new Dictionary<ReturnMenuType, List<IMenu>>()
        {
            { ReturnMenuType.TopLevel, new List<IMenu>() { some items } },
            { ReturnMenuType.MidLevel, new List<IMenu>() { some items } },
            { ReturnMenuType.BottomLevel, new List<IMenu>() { some items } }
        };
    }

    // getting menu for a level is now as simple as querying the dictionary
    public IEnumerable<IMenu> GetMenusForLevel(ReturnMenuType type)
    {
        return _menuItems[type];
    }
}

现在你的GetVisibleMenusForLevel更简单了:

public IEnumerable<IMenu> GetVisibleMenusForLevel(ReturnMenuType type)
{
    return db.GetMenusForLevel(type).Where(m => m.Visible);
}

最后,问问自己是否甚至需要ReturnMenuType枚举。我非常肯定你完全可以remove the type code and replace it with polymorphism

答案 5 :(得分:0)

在构造函数中放置一个默认值

根据您的偏好选择返回NULL或异常。

switch (returnType)
{
    case ReturnMenuType.TopLevel:
        return menuTop;
    case ReturnMenuType.MidLevel:
        return menuMid;
    case ReturnMenuType.BottomLevel:
        return menubottom;
    default:
        return null;
        //or
        throw new ArgumentOutOfRangeException("Returntype is not correct.");
}

根据您的偏好:

如果返回NULL:

var l = yourobject.GetMenuItemsFromLevel(ReturnMenuType.Unknown);
if(l == null)
return;

如果您使用例外

try
{
    var l = yourobject.GetMenuItemsFromLevel(ReturnMenuType.Unknown);
}
catch(ArgumentOutOfRangeException ex)
{
    //handle your exception
    MessageBox.Show(ex.Message);
}