这可能是一个相对简单的疏忽,但是如果我真的被允许这样做,或者是一个合理的选择(在VS2010中,C#.Net 4.0中使用),我就无法解决。如果可能的话,我强烈希望在构造函数中执行此操作。

这是我的课:

public class MyClass1<TOrderBy> : MyInterface1<MyType1, MyType2>
{
    public MyClass1(IEnumerable<Guid> ids) : this(ids, 0, 10, a => a.Time, ListSortDirection.Ascending) { }

    public MyClass1(IEnumerable<Guid> ids, int pageIndex, int itemsPerPage, Expression<Func<MyType2, TOrderBy>> orderBy, ListSortDirection sortDirection)
        {
            this.pageIndex = pageIndex;
            this.itemsPerPage = itemsPerPage;
            this.orderBy = orderBy;
            this.sortDirection = sortDirection;
            this.ids = ids != null ? ids.ToList() : new List<Guid>();
        }
}


我得到错误

悬停在Cannot convert expression type 'System.DateTime' to return type 'TOrderBy'上时a => a.Time

以及构建时出现的错误Cannot convert lambda expression to delegate type 'System.Func<MyType2,TOrderBy>' because some of the return types in the block are not implicitly convertible to the delegate return typeCannot implicitly convert type 'System.DateTime' to 'TOrderBy'

正如您可能可以解决的那样,我正在尝试构建一个类,该类在构造函数中获取信息以对IQueryable进行排序和分页。
我想通过重载的构造函数提供默认值。我将如何去做呢?

最佳答案

a => a.Time


时间是DateTimeTOrderBy可能不是DateTime,例如:

MyClass1<Car> x = new MyClass1<Car>(ids);


因此,您无法做您想做的事情。



TOrderBy真是太痛苦了!最好的主意是,如果可以帮助的话,最好不要在类中加入TOrderBy来避免出现此问题。 This answer显示了一种包装订购表达式的方法,以使TOrderBy对外界隐藏。

关于c# - 在构造函数中的Expression <Func <MyType,TOrderBy >>中使用泛型,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10031074/

10-09 17:12