IQueryable 扩展方法编译错误来自泛型方法



IQueryable扩展方法在普通方法中很好,但在通用方法中则不行。

编译错误:IQueryable 不包含 MyExtension 的定义,最佳扩展方法重载 DataExtensions。MyExtension(IQueryable Fred( 需要 IQueryable Fred 类型的接收器

目标是将下面的// do something interesting转换为适用于所有FlintstoneObject类型的通用方法。

public static class RepetitiveCodeBelow
{
public static int RepetitiveCode()
{
var count = 0;
using (var context = new DataContext())
{
foreach (var data in context.Freds.AsNoTracking().Where(item => item.PrimaryKey > 0).MyExtension())
{
// do something interesting
}
foreach (var data in context.Barnies.AsNoTracking().Where(item => item.PrimaryKey > 0).MyExtension())
{
// do something interesting
}
// more types omitted
}
return count;
}
}

工作版本:

public List<Fred> GetFredList()
{
using (var context = new DataContext())
{
return context.Freds.AsNoTracking().MyExtension().ToList();
}
}

不会编译:

public List<T> GetList<T>() where T : FlintstoneObject<T>, new()
{
using (var context = new DataContext())
{
return context.Set<T>().AsNoTracking().MyExtension().ToList();
}
}

完整示例

public abstract class FlintstoneObject<T> where T : class
{
public abstract int PrimaryKey { get; set; }
}
public class Fred : FlintstoneObject<Fred>
{
public override int PrimaryKey { get; set; }
}
public class Barny : FlintstoneObject<Barny>
{
public override int PrimaryKey { get; set; }
}
public static class DataExtensions
{
public static IQueryable<Fred> MyExtension(this IQueryable<Fred> queryable)
{
return queryable;
}
}
public class DataContext : DbContext
{
public DbSet<Fred> Freds { get; set; }
public DbSet<Barny> Barnies { get; set; }
public List<Fred> GetFredList()
{
using (var context = new DataContext())
{
return context.Freds.AsNoTracking().MyExtension().ToList();
}
}
public List<T> GetList<T>() where T : FlintstoneObject<T>, new()
{
using (var context = new DataContext())
{
return context.Set<T>().AsNoTracking().MyExtension().ToList();
}
}
}

您的代码可能缺少此扩展:

public static IQueryable<T> MyExtension<T>(this IQueryable<T> queryable)
{
return queryable;
}

以使其可编译。

无论如何,你打算用你的通用东西做什么看起来很奇怪:

public class Fred : FlintstoneObject<Fred>

我认为T应该是继承泛型类型FlintstoneObject<T>Fred以外的某个类。

相关内容

  • 没有找到相关文章