动态提供类名

时间:2013-04-23 07:44:37

标签: c# asp.net-mvc-3

我有一个如下所示的类,其中定义了页面的权限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。但我不确定这是否可以在这里完成。

4 个答案:

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

修改

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

但这可能超出了手头问题的范围。