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.IList1 [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;
}

Оба из которых должны работать.

Другие вопросы по тегам