2012-04-20 10 views
1

私はカスタムインターセプトビヘイビアを使用してレコードをフィルタリングします(フィルタは現在のユーザーに基づいています)。しかし、これはインターセプタの本体Invokeメソッドです。Unityインターセプト - カスタムインターセプト動作

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

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

CompaniesVisibleToUserは、ユーザーが表示できる企業IDの文字列リストを提供します。

私の問題は、入力データ - 企業 - は、ICompanyIdを実装する必要がある様々なタイプのIListであり、データがcompanyIdでフィルタリングされることです。しかし、キャストは、IEnumerableとしてデータがこの型として返され、呼び出しスタックの上に問題が発生するように思われるようです。

戻り値の型を変更せずにフィルタを実行するにはどうすればよいですか?

私が手に例外が

型のオブジェクトをキャストすることができませんでは、 '[PTSM.Application.Dtos.EmployeeOverviewDto] 1[PTSM.Application.Dtos.ICompanyId]' to type 'System.Collections.Generic.IList 1をSystem.Collections.Generic.List'。

高い呼び出し側が

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

私はIEnumerableを<EmployeeOverviewDto>

IEnumerableを<ICompanyId>を変更した場合は期待どおりに動作しますが、明らかにこれは私が意志をフィルタリングされたリストとして望むものではないです必ずしもそのタイプであるとは限りません。

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

どちらも動作するはずです。

関連する問題