-1

我有一堂电影:

internal class Movie
    {
        public string Name { get; set; }
        public string Year { get; set; }
    }

我有这个代码:

 var Movies = CreateMovies(); //IEnumerable<Movie>
 var sorter = new Sorter<Movie>();
 sorter.AddSort(Movies,  m => m.Year , a=>a.Name ,.....as many as I want....);

这是Sorter课程:

 class Sorter<T>
{
    public void AddSort(IEnumerable<T> movs,  params Expression<Func<T, object>>[]    funcs)
    {
                 /*...*/ 
        movs.OrderBy(d=>d.); //<----- here is the problem : where is the columns ?
    }
}

问题 :

当我需要智能时d,它会告诉我:

在此处输入图像描述

我不明白为什么T不推断为Movie

看看有多少位置在推断这T是一个Movie

在此处输入图像描述

我怎样才能让那些电影领域出现,而不改变Ienumerable<Movies>

4

3 回答 3

8

在编译Sorter类时,编译器不知道它将是什么类型,因此它无法判断将使用它的用户是否具有Year属性。

但是,您可以使用where 约束

class Sorter<T> where T: Movie

这样编译器就知道给定的类T将具有Year属性以及其他属性

在泛型类型定义中,where 子句用于指定对可用作泛型声明中定义的类型参数的参数的类型的约束。例如,您可以声明一个泛型类 MyGenericClass,以便类型参数 T 实现 IComparable 接口:

所以正如它所说你甚至不必做

class Sorter<T> where T: Movie

我们只能满足

class Sorter<T> where T: ImyInterface

andImyInterface将包含Name和的属性Year

于 2013-09-08T13:11:58.147 回答
1

我没有尝试这段代码,但我认为你应该能够按照以下方式做一些事情:

foreach(var func in funcs)
    movs = movs.OrderBy(func);

简单地将排序函数委托给 OrderBy 方法,而无需关心这些函数是什么以及 T 是什么类(这违背了泛型的目的)。

于 2013-09-08T13:17:56.653 回答
0

以下是我对您的问题和意图的解释:

1>您正在使用 Sorter 类与非泛型 Sorter ,因为您打算让此类处理多种类型。

2> 因为对于 AddSort 方法,您希望它基于 Movie 类成员,因此这表明您将拥有基于 Movie 类的派生类,如 XYXMovie:Movie 等,Sorter 将用于这些类。

如果我的上述观察是正确的,那么您需要将您的 Sorter 类绑定到基类“Movie”,以便它可以处理从类 Movie 派生的所有类型。

为此,您必须使用 where 约束,例如 class Sorter where T: Movie。

这使您的 Sorter 类与基类 Movie 相关联,但可以处理其所有子类。

于 2013-09-08T13:56:22.683 回答