2017-02-16 2 views
1

を推測することはできません。オプションの一般的な型指定されたパラメータは、私はこのようなメソッド定義持っていた

public List<TEntity> GetAll<T> (
    params Expression<Func<TEntity, T>>[] fieldsToExclude) 
{ 
    ... 
} 

をしかし、私はこのようにそれを作るとき、私は、異なるタイプを持つことができません。

だから私はこれにそれを変更しました:

public List<TEntity> GetAll<T1, T2, T3, T4, T5, T6, T7, T8> (
    Expression<Func<TEntity, T1>> field1ToExclude, 
    Expression<Func<TEntity, T2>> field2ToExclude = null, 
    Expression<Func<TEntity, T3>> field3ToExclude = null, 
    Expression<Func<TEntity, T4>> field4ToExclude = null, 
    Expression<Func<TEntity, T5>> field5ToExclude = null, 
    Expression<Func<TEntity, T6>> field6ToExclude = null, 
    Expression<Func<TEntity, T7>> field7ToExclude = null, 
    Expression<Func<TEntity, T8>> field8ToExclude = null) 
{ 
    ... 
} 

そして、私はそれが好きで使用しよう:

var allItems = GetAll(p => p.SomeProperty1, p => p.SomeProperty2); 

しかし、今、クライアント側でそれは言う:

型引数を'...'はその使用法から推測できません。

私はオプションのパラメータを一切使用しないので意味があります。私はすべてのパラメータを与えるとき、それは正常に動作しますが、オプション性はそれを誤っています。

テレスコープパラメータを使用して多くのメソッドを作成することは不可能です。しかし、あまりにも控えめなやり方があるはずです。この機能をどのように提供できますか?

+0

あなたは 'paramsは式<のFunc > [] fieldsToExclude'と(それらの式を渡すEntityFrameworkプロバイダであると仮定すると)実際の式の型キャストを処理します。 – haim770

+0

基本的に解決策はありません。典型的な回避策は 'params Expression > []'を使い、値型について導入された 'Expression.Convert'を扱うことです。 –

+0

EntityFrameworkプロバイダではないので、型キャストを処理する必要はありません。私はフィールドの名前を使用するだけで、実際には 'T 'を使用していませんでした。したがって、これは実際に動作するはずです。あなたはanswer @ haim770として投稿するべきです。 –

答えて

1

あなたの式がObjectを返すと和解することができますので、あなたは、単に一般的な引数を省略し、代わりにObjectを使用することができます。

public List<TEntity> GetAll<TEntity> (params Expression<Func<TEntity, Object>>[] fieldsToExclude) 
{ 
    ... 
} 
関連する問題