C# 泛型方法和无效的上下文异常
我正在尝试编写一个自定义授权服务,在其中注册一个模块,以检查表示可用活动的特定枚举的权限:C# 泛型方法和无效的上下文异常,c#,.net,generics,enums,C#,.net,Generics,Enums,我正在尝试编写一个自定义授权服务,在其中注册一个模块,以检查表示可用活动的特定枚举的权限: public interface IAuthorizationService { void Register<T>(IAuthorizationModule module); bool Authorize<T>(T activity); } public class AuthorizationService : IAuthorizationService {
public interface IAuthorizationService
{
void Register<T>(IAuthorizationModule module);
bool Authorize<T>(T activity);
}
public class AuthorizationService : IAuthorizationService
{
private readonly Dictionary<Type, IAuthorizationModule> activities;
public AuthorizationService()
{
activities = new Dictionary<Type, IAuthorizationModule>();
}
public void Register<T>(IAuthorizationModule module)
{
activities[typeof(T)] = module;
}
public bool Authorize<T>(T activity)
{
return activities[typeof(T)].Authorize(activity);
}
}
public interface IAuthorizationModule
{
bool Authorize<T>(T activity);
}
public class OrderAuthModule : IAuthorizationModule
{
public bool Authorize<OrderActivity>(OrderActivity activity)
{
return activity == OrderActivity.Cancel;
}
}
public enum OrderActivity
{
Place,
Cancel,
Refund
}
公共接口IAuthorizationService
{
无效寄存器(IAuthorizationModule);
bool授权(T活动);
}
公共类授权服务:IAuthorizationService
{
私人只读词典活动;
公共授权服务()
{
活动=新字典();
}
公共无效寄存器(IAuthorizationModule)
{
活动[类型(T)]=模块;
}
公共bool授权(T活动)
{
返回活动[类型(T)]。授权(活动);
}
}
公共接口授权模块
{
bool授权(T活动);
}
公共类OrderAuthModule:IAAuthorizationModule
{
公共bool授权(订单活动)
{
返回活动==OrderActivity.Cancel;
}
}
公共枚举顺序活动
{
地点,,
取消,
退款
}
此代码无法编译,出现以下异常:
“OrderActivity”是一个“类型参数”,在给定上下文中无效
在线:return activity==OrderActivity.Cancel代码>
我无法将接口声明为IAuthorizationModule
,因为我需要一个
字典来注册将响应类型t
(枚举)的模块
我缺少什么?请试试这个,路易斯
OrderActivity act = (OrderActivity)Enum.Parse(typeof(OrderActivity), activity.ToString());
switch (act)
{
case OrderActivity.Place:
return true;
break;
case OrderActivity.Cancel:
return false;
break;
default:
return default(bool);
}
编辑:
重要的是switch()上面的一行,在这里您将活动变量解析为enum变量并将其放入开关中,希望它有帮助……1)我们检查T(占位符在我的情况下未设置为任何值)和enum值是否相等,在您的情况下是异常(使用类型(T))2)它不起作用,因为我们处理的T没有定义为任何特定的东西,swtch对bool、string、char、int、enum或相应的可空类型和活动进行操作,我的编辑是T,很高兴我能提供帮助:)嗯,我听不懂你的设计。根据AuthorizeService
的具体类和实现,我假设每个IAuthorizationModule
只负责一种类型的活动。如果我是对的,那么接口应该声明为
public interface IAuthorizationModule<T>
{
bool Authorize(T activity);
}
public class OrderAuthModule : IAuthorizationModule<OrderActivity>
{
public bool Authorize<OrderActivity>(OrderActivity activity)
{
return activity == OrderActivity.Cancel;
}
}
这样,每个IAuthorizationModule
更新authorization
到
会更容易实现
public class OrderAuthModule : IAuthorizationModule
{
public bool Authorize<T>(T activity)
{
return activity.ToString() == OrderActivity.Cancel.ToString();
}
}
公共类OrderAuthModule:IAAuthorizationModule
{
公共bool授权(T活动)
{
return activity.ToString()==OrderActivity.Cancel.ToString();
}
}
用法:
var authorization = new AuthorizationService();
var orderMod = new OrderAuthModule();
authorization.Register<OrderActivity>(orderMod);
var status = authorization.Authorize(OrderActivity.Place);
var authorization=new AuthorizationService();
var orderMod=new OrderAuthModule();
授权。注册(orderMod);
var status=authorization.Authorize(OrderActivity.Place);
希望,我没有弄错上下文
对于记录:
var authorization = new AuthorizationService();
var orderMod = new OrderAuthModule();
authorization.Register<OrderActivity>(orderMod);
var status = authorization.Authorize(OrderActivity.Place);
可以使用struct约束将泛型类型参数约束为值类型(例如int、bool和enum)或任何自定义结构:
公共类MyClass,其中T:struct
{...}
哪一行给了您错误信息?对不起,是的。使用行错误编辑。您可以在接口方法luiz中设置约束吗?属于orderactivity@terrybozzio我无法创建接口IAuthorizationModule
。这样做就不可能创建Dictionary@terrybozzio你能给我举个例子吗?我想我没有听懂你的话……我回复了你的说法,在你编辑之前我只使用枚举值。实际上,我将拥有更多的模块和枚举(例如,CustomerAuthModule
和CustomerActivity
),因此需要一个通用解决方案。抱歉造成混淆。那么这个authorize方法将用于接收各种枚举的这个类(OrderAuthModule),或者,将在不同的类中实现一个方法(authorize)?…比如,这个类接收orderactivity得到这个方法,其他类得到这个方法但接收其他枚举?刚刚编辑的luiz,经过测试,得到了正确答案,希望你也一样……现在它开始工作了。:)虽然您的答案是正确的,但在将其标记为已接受之前,我有几个问题:1)为什么我不能像在正常情况下那样使用简单的比较(==
)?2) 我仍然不能在switch语句中使用它,为什么?不过,谢谢您的答案是正确的,但我选择@tia的答案作为接受答案,因为类型转换只发生在一个位置(AuthorizationService
),而不是每个IAAuthorizationModule
)。非常感谢您的帮助。:)没错,每个IAuthorizationModule
只负责一个活动(enum)。我喜欢您的解决方案,我只需要在一个位置(AuthorizationService
)而不是每个iaauthorizationmodule
)进行类型转换。只有一个更正:IAuthorizationModule
中的方法签名应该是bool Authorize(T activity)
。使用Authorize
会给我带来与以前相同的错误。。。非常感谢。您的答案是正确的,但我选择@tia的答案作为接受答案,因为类型转换只发生在一个位置(AuthorizationService
),而不是每个IAAuthorizationModule
)。非常感谢您的帮助。:)
var authorization = new AuthorizationService();
var orderMod = new OrderAuthModule();
authorization.Register<OrderActivity>(orderMod);
var status = authorization.Authorize(OrderActivity.Place);
public class MyClass<T> where T : struct
{...}