2017-08-23 2 views
1

J'ai un Generic Abstract Class avec des propriétés comme Id, Name, Status, cette classe hérite de plusieurs catalogues. Ma question est de savoir s'il est possible de créer une méthode avec une restriction pour les catalogues qui implémentent la classe abstraite.Type générique Contrainte où class implémente une classe abstraite

Je donne quelques exemples afin qu'ils comprennent ce que je veux faire:

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

Ce sont les classes qui mettent en œuvre la 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; } 
} 

La méthode que je veux mettre en œuvre est le suivant:

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; 
} 

Répondre

3

Je pense que le seul moyen est d'utiliser deux types génériques paramètres ici, par exemple:

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

Et puis appelez comme ceci:

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

Mais dans la validation, il marque une erreur: 'if (List.exists (x => x.Id .ToString() == "0")) ' Parce que maintenant Id est de type U – Richard

+1

Cela ne peut pas être une erreur car tout hérite de' object' qui a 'ToString'. En outre, vous ne devriez pas vérifier avec '==" 0 "', au lieu de considérer 'default (U)' ou passer une valeur par défaut à la méthode. – DavidG