2017-02-16 2 views
1

Ich hatte eine Methode Definition wie folgt abgeleitet werden:Optional generic typisierte Parameter können nicht

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

Aber wenn ich es so machen kann ich nicht verschiedene Typen haben.

So habe ich es so weit geändert:

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) 
{ 
    ... 
} 

Und ich versuche, es zu benutzen mag:

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

Aber jetzt auf Client-Seite heißt es:

Typ Argumente "..." lässt sich aus der Verwendung nicht ableiten.

Es macht Sinn, da ich die optionalen Parameter überhaupt nicht verwende. Wenn ich alle Parameter gebe, funktioniert es gut, aber die Optionalität macht es falsch.

Erstellen Sie viele Methoden mit einem Teleskop-Parameter ist ein Ausweg. Aber es muss auch einen besseren Weg geben, nehme ich an. Wie kann ich diese Funktionalität bereitstellen?

+0

Sie werden mit 'params Expression gehen müssen > [] fieldsToExclude' und (vorausgesetzt, es handelt sich um den EntityFramework-Anbieter, an den Sie diese Ausdrücke übergeben), befassen sich mit dem eigentlichen Ausdruckstyp-Casting. – haim770

+0

Grundsätzlich hat keine Lösung. Die typische Problemumgehung besteht darin, 'params Expression > []' zu verwenden und mit 'Expression.Convert' umzugehen, das für Werttypen eingeführt wird. –

+0

Nun, es ist kein EntityFramework-Anbieter, daher muss ich mich nicht mit dem Typ Casting beschäftigen. Ich benutze nur den Namen des Feldes und ich habe tatsächlich keine der 'T's benutzt. Daher sollte das tatsächlich funktionieren. Sie sollten es als Antwort @ haim770 veröffentlichen. –

Antwort

1

Da Sie mit Ihrem Ausdrücke Rückkehr Object absetzen können, können Sie einfach das allgemeine Argument weglassen und verwenden Object statt:

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