2017-08-23 94 views
1

我有一個Generic Abstract ClassId,Name,Status一些屬性,該類繼承了幾個目錄。 我的問題是是否有可能創建一個方法限制實現抽象類的目錄。通用類型約束其中類實現抽象類

我舉一些例子,讓他們明白我想做的事:

public abstract class AbsCatalog<T> 
{ 
    public T Id { get; set; } 
    public string Name { get; set; } 
    public bool Status { get; set; } 
} 

這些是實現abstract class

public class Agent : AbsCatalog<string> 
{ 
    public string Office { get; set; } 
    public Estado Estado { get; set; } 
} 

public class Models : AbsCatalog<int> 
{ 
    public int Year { get; set; } 
    public string Description { get; set; } 
} 

我想要實現的方法的類如下:

List<Agent> Agents = service.GetAgents(); 
string AgentsDescription = GetDescription<Agent>(Agents); 

List<Model> Models = service.GetModels(); 
string ModelsDescription = GetDescription<Model>(Models); 

private string GetDescription<T>(List<T> list) where T : AbsCatalog<T> 
{ 
    string description = string.Empty; 

    if (list.Exists(x => x.Id.ToString() == "0")) 
     description = ""; 
    else 
     description = string.Join(", ", list.Where(x => x.Status).Select(x => x.Name).ToArray()); 

    return description; 
} 

回答

3

我想唯一的方法是使用兩個泛型類型這裏參數,例如:

private string GetDescription<T, U>(List<T> list) where T : AbsCatalog<U> 
{ 
    //snip 
} 

然後調用它是這樣的:

string AgentsDescription = GetDescription<Agent, string>(Agents); 
+0

但在驗證,它標誌着一個錯誤: '如果(list.Exists(X => x.Id .ToString()==「0」))' 因爲現在Id的類型爲U – Richard

+1

這不能是一個錯誤,因爲一切都從具有'ToString'的對象繼承。此外,你不應該檢查'==「0」',而是考慮'默認(U)'或傳入一個默認值的方法。 – DavidG