2017-06-03 3 views
1

Hier geht meine erste Frage in Stack Overflow. Also, bitte ertragen Sie mich und ich hoffe, ich kann Sie auf mein Problem aufmerksam machen ... (Entschuldigung, wenn das eine Wiederholung ist, aber ich habe viel gesucht und ich konnte keine Antwort für das genaue Problem finden, das ich noch habe Ich könnte es aus anderen Antworten herausfinden).Ausdruck Eigenschaft mit generischem Parameter

Lassen Sie mich Ihnen zuerst den Code zeigen, damit Sie einen Kontext bekommen können (Spoiler: Das Problem, das ich habe, ist mit keySelector).

Ich habe diese Methode in einer Klasse:

public class BaseTableDataStore<T> : BaseTableDataStore, ITableDataStore<T> where T : Models.EntityData 
{ 
    ... 
    public virtual async Task<IEnumerable<T>> GetItemsQueryAsync<Tkey>(Expression<Func<T, bool>> predicate, Expression<Func<T, Tkey>> keySelector) 
    { 
     ... 
     return await Table.Where(predicate).OrderBy(keySelector).ToEnumerableAsync(); 
     ... 

    } 
    ... 
} 

Dann habe ich diese andere Klasse:

public class ConnectedObservableCollection<T> : ObservableRangeCollection<T> where T : EntityData 
{ 
    ITableDataStore<T> table; 
    public Expression<Func<T, bool>> Predicate { get; set; } 
    public Expression<Func<T, long?>> KeySelector { get; set; } 
    ... 
    public async Task Refresh() 
    { 
     ... 
     _items = await table.GetItemsQueryAsync(Predicate, KeySelector); 
     ... 
    } 
    ... 
} 

Schließlich habe ich den folgenden Code in einer anderen Klasse:

ConnectedObservableCollection<MeterEntry> meterEntries; 
... 
meterEntries.Predicate = (s => s.Type == 1); 
meterEntries.KeySelector = (s => s.Value); 

await MeterEntries.Refresh(wait); 
... 

Das wird natürlich gut funktionieren, wenn s.Valuelong? ist. Aber ich mag diese Eigenschaft generic machen, so kann ich jede Art von Parametern verwenden, anstatt nur long?

public Expression<Func<T, long?>> KeySelector { get; set; } 

Ich hoffe, es ist klar genug ...

Dank!

Antwort

0

Wenn Sie dies ändern mögen:

public Expression<Func<T, long?>> KeySelector { get; set; } 

dazu (ersetzen long mit einem zweiten generischen Typ)

public Expression<Func<T, T2>> KeySelector { get; set; } 

dann, dass die zweite generischer Typ muss in Ihrer Klassendefinition enthalten sein.

ändern

public class ConnectedObservableCollection<T> 
    : ObservableRangeCollection<T> where T : EntityData 

zu

public class ConnectedObservableCollection<T, T2> 
    : ObservableRangeCollection<T> where T : EntityData 
+0

Danke für die Antwort! Ja, das funktioniert, aber dann müsste ich ConnectedObservableCollection ändern meterEntries; zu ConnectedObservableCollection meterEntries; (oder einen anderen Typ, den ich für jede Instanz verwenden möchte.) Ich frage mich, ob es einen Weg geben würde, an dem sich die Klassendeklaration nicht ändert, und ich behandle das irgendwie für die KeySelector-Eigenschaft. –

Verwandte Themen