所以,在处理Func<>,泛型和lambda表达式时,我有点不在我的舒适区域,但我认为我得到了一般的想法(有点),但仍然有点困惑。
我已经实现了SortableObservableCollection类(取自某个地方的在线 - 感谢无论是谁从我那里得到它!)并使用它:
_lookuplistViewModel.Sort(x => x.BrandName, ListSortDirection.Ascending);
其中x是可排序集合实现的对象类型。在这个例子中,BrandName是实现的对象类型的属性,但是我想在泛型类中使用上面的代码并传入要排序的属性。 Sort方法如下所示:
public void Sort<TKey>(Func<T, TKey> keySelector, ListSortDirection direction)
{
switch (direction)
{
case ListSortDirection.Ascending:
{
ApplySort(Items.OrderBy(keySelector));
break;
}
case System.ComponentModel.ListSortDirection.Descending:
{
ApplySort(Items.OrderByDescending(keySelector));
break;
}
}
}
调用Sort方法的泛型类定义如下:
public class ExtendedLookupManagerViewModel<VMod, Mod> : LookupManagerViewModel
where VMod : ExtendedLookupViewModel
where Mod : ExtendedLookupModelBase
我想像这样创建一个实例:
_medProd = new ExtendedLookupManagerViewModel<MedicinalProductViewModel, MedicinalProduct>(string property);
其中property
是要排序的属性。理想情况下,这应该是类型安全的,但字符串就足够了。
任何人都可以帮助引导我朝着正确的方向前进吗?
答案 0 :(得分:2)
您不应该接受字符串属性参数,而是接受Func<T, IComparable>
,其中T可能是VMod或Mod,具体取决于您要排序的内容。
答案 1 :(得分:2)
只需使构造函数sig与sort方法的sig匹配,并在调用Sort()时缓存params以便在集合中使用。所以不是“字符串属性”,而是sig用于排序方法的任何东西。
传递的参数然后是一个func,它可以是特定于类型的,并指导你到元素,实例化将是
_medProd = new ExtendedLookupManagerViewModel<MedicinalProductViewModel, MedicinalProduct>(x => x.BrandName, ListSortDirection.Ascending);
答案 2 :(得分:1)
嗯,你的Sort方法只在TKey
中是通用的--T来自哪里?我怀疑它应该是Func<VMod, TKey>
或Func<Mod, TKey>
,但我不确定你所展示的是哪一个。
BrandName
或MedicinalProductViewModel
的属性是什么MedicinalProduct
?假设它是MedicinalProduct
,您的方法应声明为:
public void Sort<TKey>(Func<Mod, TKey> keySelector, ListSortDirection direction)
此时我怀疑它会起作用......