2012-04-20 3 views
1

Я использую пользовательский метод перехвата для фильтрации записей (фильтр основан на том, кто является текущим пользователем), однако у меня есть некоторые трудности (это тело метода Invcept-перехватчиков)Unity Interception - пользовательское поведение перехвата

var companies = methodReturn.ReturnValue as IEnumerable<ICompanyId>; 
List<string> filter = CompaniesVisibleToUser(); 

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

КомпанииVisibleToUser предоставляют строковый список идентификаторов компании, которые пользователю разрешено просматривать.

Моя проблема - входящие данные - компании - будут 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> он работает, как ожидалось, но очевидно, что это не то, что я хочу, как список фильтрации будет не всегда должны быть такого типа.

+0

Что значит, что приведение к 'IEnumerable ' вызывает некоторую проблему с преобразованием? Объект в типе памяти никогда не менялся. – Tejs

+0

@David: И каков исходный тип возврата? –

+0

@Tejs Я отредактировал мой вопрос, чтобы включить более подробную информацию – David

ответ

0

При выполнении задания:

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; 
} 

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

Смежные вопросы