Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 泛型方法和无效的上下文异常_C#_.net_Generics_Enums - Fatal编程技术网

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 

{...}