好的,我已经创建了自定义角色提供程序并将其添加到web.config中。这是我的角色提供者代码的一部分:
public class MyCustomRoleProvider : RoleProvider
{
public override bool IsUserInRole(string username, string roleName)
{
return true;
}
public string MyCustomFunction()
{
return "its my custom string";
}
}
当我需要在我的应用程序中使用角色提供程序时,我会这样称呼它:
var truth = Roles.IsUserInRole("myUsername", "myFakeRole");
好的,太棒了!它调用我的自定义代码(我可以通过调试告诉)并且每次都返回true。为什么我不能在我的自定义角色提供程序上进行以下调用?
var no_compile = Roles.MyCustomFunction();
如何让我的自定义角色提供程序的所有公共成员都可以访问?
答案 0 :(得分:2)
我真的不知道是什么问题,但你应该能够做到
var no_compile = _Roles.MyCustomFunction();
如果_Roles
定义了新的MyCustomRoleProvider
,因为该功能是公开的
示例强>
MyCustomRoleProvider _Roles = new MyCustomRoleProvider();
var no_compile = _Roles.MyCustomFunction();
请注意:您无法直接致电MyCustomRoleProvider.MyCustomFunction()
,因为它不是public static string
。
请注意:System.Web.Security.Roles
是一个类,它包含类IsUserInRole(string username, string roleName)
的相同函数名,但两个类中的函数不同。因此,您无法访问Roles.MyCustomFunction()
,因为类System.Web.Security.Roles
不包含MyCustomFunction()
的定义,那是因为您没有在类中定义新函数
MyCustomRoleProvider
和System.Web.Security.Roles
是两个具有不同功能的不同类
请注意:您无法修改或添加System.Web.Security.Roles
函数,因为它是写保护的
谢谢, 我希望你觉得这很有帮助:)
答案 1 :(得分:2)
原因是Roles.IsUserInRole
是一个静态方法,它有一个实现来选择当前RoleProvider
并执行它的IsUserInRole
实例方法。内部使用的类型不是MyCustomRoleProvider
类型,而是RoleProvider
。这实际上就是这个问题:
public class BaseClass
{
public virtual void Foo() { }
}
public class DerivedClass
{
public virtual void Foo() { }
public void MoreFoo() { }
}
BaseClass instance = new DerivedClass();
instance.MoreFoo(); // Doesn't compile
该类,即使它是派生版本,因为它被用作基类型,但不知道您在自定义提供程序中的实现。
要使其可访问,您可以创建自己的静态实现,在内部可以执行您想要的所有调用:
public static class Roles
{
protected static Lazy<MyCustomProvider> _provider = new Lazy<MyCustomProvider>(() => System.Web.Security.Roles.Provider);
public static MyCustomProvider Provider { get { return _provider.Value; } }
public static IsUserInRole(string userName, string roleName)
{
return _provider.Value.IsUserInRole(userName, roleName);
}
public static MyCustomFunction()
{
return _provider.Value.MyCustomFunction();
}
}