IQueryable-Erweiterungsmethode ist in der normalen Methode in Ordnung, aber nicht innerhalb einer generischen Methode.IQueryable Erweiterungsmethode kompilieren Fehler von Generische Methode
Compile Fehler: IQueryable keine Definition für My Extension enthalten und die beste Erweiterung -Methodenüberladung DataExtensions.MyExtension (IQueryable Fred) IQueryable Fred
Tor drehen einen Empfänger vom Typ erfordert die // do something interesting
ist unten in ein generische Methode, die quer durch alle FlintstoneObject
Typen funktionieren würde.
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;
}
}
Arbeitsversion:
public List<Fred> GetFredList()
{
using (var context = new DataContext())
{
return context.Freds.AsNoTracking().MyExtension().ToList();
}
}
Wont kompilieren:
public List<T> GetList<T>() where T : FlintstoneObject<T>, new()
{
using (var context = new DataContext())
{
return context.Set<T>().AsNoTracking().MyExtension().ToList();
}
}
Voll Probe
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();
}
}
}
Die Ausnahmebedingungsnachricht ist selbsterklärend. Basierend auf Ihrer aktuellen Version der Erweiterungsmethode wird es nur auf 'IQueriable' funktionieren. Was versuchst du letztendlich zu tun? –
Nkosi
Der Fehler scheint mir ziemlich klar zu sein. Ihre Erweiterungsmethode ist nur für einen Ausdruck mit dem Typ 'IQueryable' gültig. Aber in Ihrer generischen Methode kann der Compiler nur beweisen, dass der Typ 'IQueryable ' '' T: FlintstoneObject 'ist. Das ist nicht gut genug, um eine Methode aufzurufen, die 'IQueryable ' erfordert. Es gibt mögliche Alternativen, die kompilieren würden. Leider bietet Ihre Frage keinen ausreichenden Kontext, um zu wissen, welche dieser Optionen für Ihren Fall geeignet wären. –
Mein Ziel ist, in eine Methode zu konsolidieren, eine Reihe von Schnipsel, die fast identisch sind, der Unterschied ist der Typ, der gehandhabt wird: Fred, Barny, etc. –