2016-02-03 27 views
-3

我在我的數據庫中有日誌以檢查產品的分類。批准分類的方法對於每個日誌系統都是相同的,儘管它們存在於我的數據庫的不同表中。爲了簡化事情有點,我決定創建一個通用的方法,如:使用模型的通用方法

[NonAction] 
public void Approve<Log>(Log log, string userId) where Log : ProductLog, CategoryLog, SubCategoryLog 
{ 
    log.approved = true; 
    log.approvedBy = userId; 
} 

凡ProductLog,CategoryLog,SubCategoryLog是從我的Asp.Net MVC項目模型。

的問題是,我得到以下錯誤:

The class type constraint 'CategoryLog' must come before any other constraints

我得到同樣的錯誤SubCategoryLog

注意ProductLog,SubCategoryLog和CategoryLog從實體框架數據庫首先生成的類。

有人可以幫我嗎?

+3

做'ProductLog','CategoryLog',或'SubCategoryLog'所有從commo繼承n基類還是實現一個通用接口,比如'ILog'?如果是這樣,那應該是你的泛型方法的限制。如果他們沒有其中之一,那就添加一個! – mason

+1

你有界面嗎? 'ILog'? –

+0

不,我不知道。你能幫助一個代碼被剪斷嗎?我閱讀了C#手冊中的接口,但我無法弄清楚如何使其適應我的問題。此外,我使用的是數據庫優先,我不想改變自動生成的模型。 –

回答

3

通用約束只能包含一個類類型約束。他們是「和」,而不是「或」。所以這個:

where Log : ProductLog, CategoryLog, SubCategoryLog 

被解釋爲三類類型約束,不支持,因爲C#沒有多重繼承。你不能有一個繼承這三種類型的類型。

現在你說:

I am using Database First

所以我認爲這三種類型的有希望在這個通用的方法來設置相同的屬性。

public interface ILog 
{ 
    bool approved { get; set; } 
    string approvedBy { get; set; } 
} 

public partial class ProductLog : ILog 
{ 
} 

public partial class CategoryLog : ILog 
{ 
} 

public partial class SubCategoryLog : ILog 
{ 
} 

現在你可以限制你的通用方法,該接口:兩個問題都通過引入接口和應用,爲這些實體的部分班一旦解決

public void Approve<TLog>(TLog log, string userId) where TLog : ILog 

,通過與指示@pseudoDust,在這種情況下,你甚至不需要仿製藥了,只是接口:

public void Approve(ILog log, string userId) 
{ 
    // ... 
} 
+2

通過一個接口,泛型可以一起避免:'public void Approve(ILog log,string userId)' – pseudoDust

+0

@pseudoDust right,thanks,added。 – CodeCaster