编辑:通过覆盖RoleProvider,我们希望仍然使用与我们的新方法相同的方法。例如Roles.GetRolesForUser(int)。
string[] myRoles3 = ((PortalRoleProvider) (Roles.Provider)).GetRolesForUser(2);
上面的代码看起来有点过分了吗?
我有一个类会覆盖RoleProvider的某些成员并添加新方法。例如
public string[] GetRolesForUser(int UserId)
{
IEnumerable<Role> RoleList = _Repo.GetRolesForUser(UserId);
string[] RetVal = new string[] {};
foreach (var curRole in RoleList)
{
RetVal[RetVal.GetUpperBound(0)] = curRole.RoleName;
}
return RetVal;
}
现在,当我处理我的代码逻辑时,我想编写Roles.GetRolesForUser(2),但是当我输入它时,它似乎确实看到了我添加的额外方法。这是类声明和webconfig。
namespace PortalMVC.Providers
{
public class PortalRoleProvider : RoleProvider
{
的Web.config
<roleManager enabled="true" defaultProvider="PortalRoleProvider">
<providers>
<clear/>
<add name="PortalRoleProvider" type="PortalMVC.Providers.PortalRoleProvider"/>
</providers>
</roleManager>
为什么会这样?
答案 0 :(得分:2)
您必须将RoleProvider转换为实际的对象类型(即PortalRoleProvider)以查看额外的功能。这适用于您扩展标准对象但正在访问它的超级类(母版页等)的任何时候。
string[] myRoles3 = ((PortalRoleProvider) (Roles.Provider)).GetRolesForUser(2);
正如您在帖子中指出的那样,上述内容有效。如果你需要在代码段中大量使用它,你可以创建一个具有正确类型的指针,然后从那里访问方法:
PortableRoleProvider TempPointer=(PortableRoleProvider)Roles.Provider;
string[] myRoles3=TempPointer.GetRolesForUser(2);
答案 1 :(得分:1)
在web.config中,您可以在其中指定角色提供程序的类型,您可能需要添加可以找到类型的程序集的名称。像这样:
<add name="PortalRoleProvider" type="PortalMVC.Providers.PortalRoleProvider, MyAssemblyName" />