Unity Interception - пользовательский режим перехвата
Я использую пользовательское поведение перехвата для фильтрации записей (фильтр основан на том, кто является текущим пользователем), однако у меня возникли некоторые трудности (это тело метода Invoke перехватчиков)
var companies = methodReturn.ReturnValue as IEnumerable<ICompanyId>;
List<string> filter = CompaniesVisibleToUser();
methodReturn.ReturnValue = companies.Where(company =>
filter.Contains(company.CompanyId)).ToList();
CompaniesVisibleToUser предоставляет строковый список идентификаторов компаний, которые пользователь может просматривать.
Моя проблема заключается в том, что входящие данные - компании - будут списками различных типов, каждый из которых должен реализовывать ICompanyId для фильтрации данных по companyId. Тем не менее, кажется, что приведение к типу IEnumerable приводит к тому, что данные возвращаются в виде этого типа, что вызывает проблемы еще выше в стеке вызовов.
Как я могу выполнить фильтр без изменения типа возврата?
Я получаю исключение
Невозможно привести объект типа 'System.Collections.Generic.List1[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>
это работает, как и ожидалось, но, очевидно, это не то, что мне нужно, поскольку фильтруемый список не всегда будет такого типа.
1 ответ
Когда вы делаете назначение:
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;
}
Оба из которых должны работать.