c# - 通用方法和无效上下文异常

标签 c# .net generics enums

我正在尝试编写一个自定义授权服务,在其中注册一个模块来检查代表可用事件的特定枚举的权限:

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
}

此代码无法编译,但出现以下异常:

'OrderActivity' is a 'type parameter', which is not valid in the given context

在线:return activity == OrderActivity.Cancel; .

我无法将接口(interface)声明为 IAuthorizationModule<T>因为我需要一本 <Type, IAuthorizationModule> 的字典注册将响应类型 T 的模块(枚举)。

我在这里缺少什么?

最佳答案

好吧,你的设计对我来说不合适。根据您的具体类和 AuthorizeService 实现,我假设每个 IAuthorizationModule 应该只负责一种类型的事件。如果我是对的,那么接口(interface)应该声明为

public interface IAuthorizationModule<T>
{
    bool Authorize(T activity);
}

public class OrderAuthModule : IAuthorizationModule<OrderActivity>
{
    public bool Authorize<OrderActivity>(OrderActivity activity)
    {
        return activity == OrderActivity.Cancel;
    }
}

您还需要相应地修改AuthorizationService:

public class AuthorizationService : IAuthorizationService
{
    private readonly Dictionary<Type, object> activities;

    public AuthorizationService()
    {
        activities = new Dictionary<Type, object>();
    }

    public void Register<T>(IAuthorizationModule<T> module)
    {
        activities[typeof(T)] = module;
    }

    public bool Authorize<T>(T activity)
    {
        return ((IAuthorizationModule<T>)activities[typeof(T)]).Authorize(activity);
    }
}

这样可以更轻松地实现每个 IAuthorizationModule

关于c# - 通用方法和无效上下文异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17099035/

相关文章:

c# - 使用 C# .Net 可被 60 整除的任何数字的正则表达式?

c# - 如何以流畅的语法编写此 LINQ 查询?

c# - 面向 .NET Core 2.0

java - Collections.binarySearch 的通用列表参数错误

generics - "borrowed value does not live long enough"具有返回 impl 特征的通用函数

java - 比较器 java <E>

c# - 带有工具栏和状态栏的 WPF DockPanel

c# - 更改时如何知道 ContentControl 的内容何时加载

c# - 使用c# selenium webdriverWait wait.untill()函数时忽略异常

.net - Asp.NET 主体 WebORB HttpHandler