我有一个如下所示的类,其中定义了页面的权限id。传递权限ID我从数据库获得权限。
public class PermissionIdConstants
{
public class SubMenus
{
public class MySubMenu1{
public const int TRAINING = 26;
public const int USER_INFO = 3;
}
public class MySubMenu2{
public const int TASKS = 2;
public const int USER_INFO = 5;
}
}
}
现在根据点击的子菜单,我必须将权限ID传递给下面的方法
单击SubMenu2 User_Info时
getPermissions(PermissionIdConstants.SubMenus.MySubMenu2);
单击SubMenu1 User_Info时
getPermissions(PermissionIdConstants.SubMenus.MySubMenu1);
现在我想知道submneu是否可以动态传递。 Somethig类似于
getPermissions(PermissionIdConstants.SubMenus. + mysubmenu );
如果它是枚举我可以使用Enum.parse。但我不确定这是否可以在这里完成。
答案 0 :(得分:0)
即使您应该使用enum
这种情况,我也会尝试为您解决当前问题。
假设您的getPermissions
函数具有类似其当前签名的内容:
bool getPermissions(Type menu)
您可以将其更改为此类内容并使用Type.GetType功能:
bool getPermissions(string menuStr)
{
Type menu = Type.GetType(menuStr);
...
}
然后你就像使用它一样:
getPermissions("PermissionIdConstants.SubMenus." + mysubmenu);
答案 1 :(得分:0)
您可以使用:
getPermissions(Type.GetType("PermissionIdConstants.SubMenus." + mysubmenu ));
答案 2 :(得分:0)
如果你想这样访问它们,也许你应该像那样存储:
public static class PermissionIdConstants
{
public static class SubMenus
{
public static Dictionary<string,int> MySubMenu1 = new Dictionary<string,int>()
{
{"TRAINING",26},
{"USER_INFO",1},
};
public static Dictionary<string,int> MySubMenu2 = new Dictionary<string,int>()
{
{"TASKS",2},
{"USER_INFO",5},
};
}
}
用法:
getPermissions(PermissionIdConstants.SubMenus[mysubmenu])
答案 3 :(得分:0)
有几种方法可以实现您所描述的内容。
使用界面,您可以在所有子菜单类上实现此功能。然后,您将通过他们的界面引用它们。 E.g:
public interface ISubMenu {
//Everything you put in here (methods, properties, ...) means that you
//a. can still use it when your submenu is cast as an object of ISubMenu type
//b. MUST implement these features on the classes that have your interface implemented.
//e.g:
public string GetMenuId();
}
public class SubMenus
{
public class MySubMenu1 : ISubMenu {
public const int TRAINING = 26;
public const int USER_INFO = 3;
public string GetMenuId()
{
return "1";
}
}
public class MySubMenu2 : ISubMenu {
public const int TASKS = 2;
public const int USER_INFO = 5;
public string GetMenuId()
{
return "2";
}
}
}
现在,您可以使用接口名称作为类型来调用方法:
public string GetPermissions(ISubMenu submenu)
{
var menu_id = submenu.GetMenuId();
//this is the only function you can call at the moment
//since this is the only one we defined in the interface.
}
//Somewhere else in the code:
var permissions = GetPermissions( new SubMenu1() );
您也可以使用generics,但我认为在这种情况下,它们并不是您真正想要的。
修改强>
我刚刚注意到你也试图在不创建新实例的情况下传递你的类。如果这是您想要的,您应该将它们设为static或singleton。
但这可能超出了手头问题的范围。