2011-01-13 24 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)); 
    } 

我可以在方法上使用自定義屬性來處理裝飾嗎?結果代碼看起來像這樣。用ClientFilter調用All方法會自動裝飾結果。在C#中使用自定義屬性進行裝飾方法結果

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

回答

1

您正在尋找PostSharp,它允許您使用屬性修改法的行爲。

但是,它會增加巨大的複雜性,可能不值得這麼簡單。

0

如果我明白你在問什麼,那麼答案可能是肯定的,但使用屬性的複雜性是不值得的。讓你的第二個代碼示例簡單如下那樣簡單嗎?

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

編輯:基於您的評論,嘗試定義FilterByClientId作爲擴展方法與通用約束:

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

我希望能夠在幾種返回IQueryable的方法上應用ClientFilter 其中T:IHasClientID – 2011-01-13 03:31:30