具有通用参数的表达式属性

时间:2017-06-03 15:04:26

标签: c# generics

这是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; }

我希望它足够清楚......

谢谢!

1 个答案:

答案 0 :(得分: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