统一拦截 - 自定义拦截行为

本文关键字:自定义 | 更新日期: 2023-09-27 18:31:44

我正在使用自定义拦截行为来过滤记录(过滤器基于当前用户是谁),但是我遇到了一些困难(这是拦截器调用方法的主体)

var companies = methodReturn.ReturnValue as IEnumerable<ICompanyId>;
List<string> filter = CompaniesVisibleToUser();
methodReturn.ReturnValue = companies.Where(company =>     
    filter.Contains(company.CompanyId)).ToList();

CompaniesVisibleToUser 提供允许用户查看的公司 ID 的字符串列表。

我的问题是传入的数据 - 公司 - 将是各种类型的IList,所有这些都应该实现ICompanyId,以便在companyId上过滤数据。但是,似乎强制转换 - 作为 IEnumerable 导致数据以这种类型返回,这会导致调用堆栈进一步向上的问题。

如何在不更改返回类型的情况下执行筛选器?

我得到的例外是

无法强制转换类型为"System.Collections.Generic.List 1[PTSM.Application.Dtos.ICompanyId]' to type 'System.Collections.Generic.IList 1[PTSM.Application.Dtos.EmployeeOverviewDto]'.

较高的调用方是

    public IList<ApplicationLayerDtos.EmployeeOverviewDto> GetEmployeesOverview()
    {
        return _appraisalService.GetEmployeesOverview();
    }

如果我更改

IEnumerable <ICompanyId> 到 IEnumerable <EmployeeOverviewDto>它按预期工作,但显然这不是我想要的,因为被过滤的列表并不总是那种类型。

统一拦截 - 自定义拦截行为

当你做作业时:

methodReturn.ReturnValue = companies.Where(company =>     
filter.Contains(company.CompanyId)).ToList();

将返回值设置为类型 List<ICompanyId>

您可以将更高的调用函数更改为:

public IList<ApplicationLayerDtos.ICompanyId> GetEmployeesOverview()
{
    return _appraisalService.GetEmployeesOverview();
}

或者您可以将其更改为以下内容:

public IList<ApplicationLayerDtos.EmployeeOverviewDto> GetEmployeesOverview()
{
    var result = (List<EmployeeOverviewDto>)_appraisalService.GetEmployeesOverview().Where(x => x.GetType() == typeof(EmployeeOverviewDto)).ToList();
    return result;
}

两者都应该有效。