使用C#

时间:2017-12-20 10:44:10

标签: c# asp.net linq generics

我目前正在为ASP.NET 4.5中的LINQ查询过滤器。我检索了2种不同的IQueryable种不同的表类型。

我会这样调用我的过滤方法:

var result = new Dictionary<DateTime, MyData>();

if(x = 1)
{
    var base = (from t in ctx.OldProjctStatistic
                 select t);

    result = GetProjectData(base);
}
else {
   var base = (from t in ctx.NewProjectStatistic
                 select t);

   result = GetProjectData(base);
}

我需要编写一个方法来过滤此结果,与其类型无关。我目前的实现如下:

private static Dictionary<DateTime, MyData> GetProjectData(IQueryable<T> base) where T : class
{
    // this method stub doesn't work unfortunately
    return null;
}

不幸的是,我在声明我的过滤器方法时遇到以下错误:

  

非泛型约束不允许使用约束

您是否知道如何编写通用方法,以过滤2种不同类型的结果?

谢谢!

2 个答案:

答案 0 :(得分:1)

要将参数T识别为通用参数,必须将其括在< >括号中,该括号表示通用参数。如果您想在此方法中对通用参数应用约束,则必须将其包含在方法的签名中:

private static Dictionary<DateTime, MyData> GetProjectData<T>(...) where T: ...

如果编译器在方法中找不到声明,它将在类级别上搜索,是否可以找到泛型类

public class MyClass<T>{...}

如果找不到任何一种情况,它会认为T只是某种对象类型(可能是你自己的发明),并告诉你不能约束普通类型,因为它已经定义了......

有关generic methods an constrains的更多信息,请访问Microsoft编程指南

的链接

答案 1 :(得分:0)

通用约束只能在通用方法中使用。所以你必须使你的方法通用:

private static Dictionary<DateTime, MyData> GetProjectData<T>(IQueryable<T> base) where T : class
{
    // this method stub doesn't work unfortunately
    return null;
}

您不必更改通话,因为可以推断出类型参数。