2011-01-13 7 views
1
public IQueryable<T> All() 
    { 
     var session = _sessionFactory.GetCurrentSession(); 
     return FilterByClientId(from r in session.Query<T>() select r); 
    } 

    public IQueryable<T> FilterByClientId(IQueryable<T> queryable) 
    { 
     return queryable.Where(row => _clientIds.ClientIds.Contains<long>(row.ClientId)); 
    } 

Kann ich benutzerdefinierte Attribut auf die Methode verwenden, um die Dekoration zu behandeln? Der resultierende Code würde ungefähr so ​​aussehen. Call to All-Methode mit dem ClientFilter würde das Ergebnis automatisch dekorieren.Verwendung eines benutzerdefinierten Attributs in C# für die Dekoration Methode Ergebnis

[ClientFilter] 
    public IQueryable<T> All() 
    { 
     var session = _sessionFactory.GetCurrentSession(); 
     return from r in session.Query<T>() select r; 
    } 

Antwort

1

Sie suchen nach PostSharp, die Sie Methode Verhalten mithilfe von Attributen ändern kann.

Allerdings wird es enorme Komplexität hinzufügen und ist es wahrscheinlich nicht wert für etwas so einfach.

0

Wenn ich verstehe, was Sie fordern, dann ist die Antwort wahrscheinlich ja, aber die Komplikationsrate Attribute zu verwenden, ist es nicht wert. Wäre es nicht einfacher, Ihr zweites Codebeispiel wie folgt zu gestalten?

// Edited to make more sense, but see below... 
public IQueryable<T> FilterByClientId() 
{ 
    return All().Where(row => _clientIds.ClientIds.Contains<long>(row.ClientId)); 
} 

EDIT: Basierend auf Ihrem Kommentar, versuchen FilterByClientId als Erweiterung Methode mit einer generischen Einschränkung definieren:

public static IQueryable<T> FilterByClientId(this IQueryable<T> queryable) where T : IHasClientId 
{ 
    return queryable.Where(row => _clientIds.ClientIds.Contains<long>(row.ClientId)); 
} 
+0

Ich möchte den ClientFilter auf mehrere Methoden anwenden können, die IQueryable wo T: IHasClientID zurückgeben –

Verwandte Themen