2016-05-18 8 views
0

Mein Code ist wie folgt:eine generische Klasse erstellen generische Erweiterung mit Ausdruck <T,bool> Methode

public partial class WhereHelper<T1> { } 
public static partial class WhereHelperExtension 
{ 
    public static T Where<T,T1>(this T t, Expression<Func<T1,bool>> where) where T : WhereHelper<T1> 
    { 
     //do something.... 
     return t; 
    } 
} 
public class Test 
{ 
    public void Main() 
    { 
     WhereHelper<DateTime> dt = new WhereHelper<DateTime>(); 
     dt.Where(t => t.Year == 2016);//this is error 
     dt.Where<WhereHelper<DateTime>, DateTime>(t => t.Year == 2016);//this is success 
    } 
} 

Erweiterung Methode, die ich so sein wollen:

WhereHelper<DateTime> dt = new WhereHelper<DateTime>(); 
dt.Where(t => t.Year == 2016);//this is error 

wie generische Erweiterung mit Expression Methode erstellen . Visual Studio erkennt die Erweiterungsmethoden "Where" nicht.

+0

Was ist der Fehler? – Rob

+0

Visual Studio erkennt die Erweiterungsmethoden "Where" nicht. –

+0

Aus dem angezeigten Code ist mir nicht klar, was diese Erweiterung tatsächlich tun soll und welchen _type_ es sich erstrecken soll. Sie geben t zurück, was bedeutet, dass Sie die Instanz zurückgeben, die Sie eigentlich erweitern möchten? Bitte bearbeiten Sie Ihre Frage und erklären Sie, was Sie erreichen möchten. Was macht 'Where' an einer einzelnen' DateTime'? –

Antwort

2

Wenn Sie in C# ein beliebiges generisches Argument angeben müssen, müssen Sie alle angeben. where Constraints geben keine Hinweise zum Typ-Resolver, und so ist es unmöglich zu entscheiden, was T1 ist.

Ihre Unterschrift auf die folgende Änderung:

public static WhereHelper<T> Where<T>(this WhereHelper<T> t, Expression<Func<T,bool>> where) 
{ 
    return t; 
} 

Hier wissen wir genau WHAT T, rein aus dem ersten Argument, und wir haben also nicht auf die Argumente explizit spezifisch.

+0

Ich möchte dieses Ergebnis nicht, The WhereHelper hat abgeleitete Klassen. –

+0

Die Erklärungen sind ziemlich richtig, aber für was ist eine Erweiterung, die die erweiterte Instanz sofort zurückgibt? –

+0

@ZhiJunLin Der obige Code bietet identische Funktionalität. Sie können weiterhin eine abgeleitete Klasse mit dem oben genannten verwenden. – Rob

Verwandte Themen