处理返回路径的最佳方法是什么?编译器说并不是所有的路径都返回一个类型,即使我在我的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;
}
}
答案 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();
但你不应该这样做。
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_level
,menu_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);
}