C#Func<>和泛型

时间:2010-07-27 12:30:08

标签: c# generics

所以,在处理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是要排序的属性。理想情况下,这应该是类型安全的,但字符串就足够了。

任何人都可以帮助引导我朝着正确的方向前进吗?

3 个答案:

答案 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>,但我不确定你所展示的是哪一个。

BrandNameMedicinalProductViewModel的属性是什么MedicinalProduct?假设它是MedicinalProduct,您的方法应声明为:

public void Sort<TKey>(Func<Mod, TKey> keySelector, ListSortDirection direction)

此时我怀疑它会起作用......