2017-07-23 2 views
0

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(); 
     } 
    } 
} 
+0

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

+0

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. –

+0

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. –

Antwort

0

Ihr Code ist probab fehlt diese Erweiterung:

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

um es kompilierbar zu machen.

Wie auch immer, was Sie wollten mit Ihren generic Sachen tun sieht seltsam aus:

public class Fred : FlintstoneObject<Fred> 

Ich dachte T einig andere Klasse als Fred sein soll, die FlintstoneObject<T> den generischen Typen erbt.

+0

Das ist nicht was ich will. Mit dieser Methode muss ich T gegen bekannte Typen überprüfen und die entsprechende spezialisierte Funktion aufrufen. –

Verwandte Themen