0

我有一个如下的类,其中定义了页面的权限 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 是否可以动态传递。类似于

getPermissions(PermissionIdConstants.SubMenus. + mysubmenu );

如果是枚举,我可以使用 Enum.parse。但我不太确定这是否可以在这里完成。

4

4 回答 4

0

即使您应该enum在这种情况下使用 an,我也会尝试为您提供当前问题的解决方案。

假设你的getPermissions函数有这样的东西作为它的当前签名:

bool getPermissions(Type menu)

您可以将其更改为类似的内容并使用Type.GetType函数:

bool getPermissions(string menuStr)
{
    Type menu = Type.GetType(menuStr);
    ...
}

然后你像这样使用它:

getPermissions("PermissionIdConstants.SubMenus." + mysubmenu);
于 2013-04-23T07:51:18.697 回答
0

你可以使用:

getPermissions(Type.GetType("PermissionIdConstants.SubMenus." + mysubmenu ));
于 2013-04-23T07:51:43.770 回答
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])
于 2013-04-23T07:55:50.663 回答
0

有几种方法可以实现您所描述的内容。

使用接口,您可以在所有子菜单类上实现此功能。然后,您将通过他们的界面引用他们。例如:

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,但我认为在这种情况下它们并不是您真正想要的。

编辑

我刚刚注意到您还试图在不创建新实例的情况下传递您的类。如果这是您想要的,您应该将它们设为静态单例

不过,这可能超出了当前问题的范围。

于 2013-04-23T07:58:22.680 回答