2017-06-03 18 views
1

這裏是我在Stack Overflow中的第一個問題。所以,請耐心等待,我希望我能指出你對我的問題...(對不起,如果這是一個重複,但我搜查了很多,我無法找到我正確的問題的答案,也沒有我可以從其他答案中找出它)。具有通用參數的表達式屬性

讓我先告訴你代碼,這樣你可以得到一些上下文(擾流板:我遇到的問題是keySelector)。

我在一類這種方法:

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(); 
     ... 

    } 
    ... 
} 

然後,我有這樣的其他類:

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

最後,我在另一個類中以下代碼:

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

await MeterEntries.Refresh(wait); 
... 

當然,當s.Valuelong?時,這當然會工作正常。不過,我想使這個屬性通用的,所以我可以使用任何類型的參數,而不是僅僅long?

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

我希望這是不夠清楚......

謝謝!

回答

0

如果你想改變這一點:

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

這個(更換long與第二泛型類型)

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

那麼第二泛型類型必須包含在類定義。

變化

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

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

感謝您的回答!是的,這是有效的,但後來我需要更改ConnectedObservableCollection meterEntries;到ConnectedObservableCollection meterEntries; (或任何其他類型我想用於每個實例,我想知道是否有一種方式,類聲明不會改變,我處理KeySelector屬性的某種方式。 –

相關問題