2010-12-13 6 views
2

Im tout à fait nouveau aux génériques et comme un exercice d'apprentissage Im essayant de créer une méthode simple qui choisit une entité d'un ensemble d'entités (table) avec un ID spécifié.C# Linq to SQL et Generics

public T GetEntity<T>(int id) where T : class 
    { 
     return db.GetTable<T>().SingleOrDefault(o => o.id == id); 
    } 

Le travail ci-dessus évidemment coutume parce o dans o.id est inconnu et ne peut donc pas accéder à la propriété id - quelqu'un peut-il aider à la façon d'y parvenir?

Répondre

1

Si vous ne pouvez pas modifier vos classes d'entité (pour la mise en œuvre d'une interface commune), vous pouvez utiliser une fonction sous-jacente et de passer dans la méthode

public T GetEntity<T>(int id, Func<T, int, bool> predicate) where T : class 
{ 
    return db.GetTable<T>().SingleOrDefault(o => predicate(o,id)); 
} 
4

Si toutes vos entités contiennent une propriété id alors vous pouvez définir une interface

public interface IEntity 
{ 
    int id { get; } 
} 

mettre en œuvre sur toutes vos classes et changer votre méthode pour

public T GetEntity<T>(int id) where T : IEntity 
{ 
    return db.GetTable<T>().SingleOrDefault(o => o.id == id); 
} 

Cette interface peut être utile tous les endroits où vous voulez faire quelque chose pour toutes vos entités, ie. Supprimer par id. Vous pouvez ajouter plus de propriétés à votre interface, à savoir. horodatage

0

Vous devez définir une contrainte sur votre T afin que le compilateur puisse être sûr qu'il existe une propriété id. Une fois est d'utiliser des interfaces, à savoir.

public interface IUnique 
{ 
    int id { get; set; } 
} 

Ensuite, vous pouvez dire

public T GetEntity<T>(int id) where T : class, IUnique 
{ 
    return db.GetTable<T>().SingleOrDefault(o => o.id == id); 
} 
1

Une autre solution, pas recommandé pour des raisons de performance, mais je poster de toute façon.

public T GetEntity<T>(int id) where T : class 
    { 

     return db.GetTable<T>().AsEnumerable().SingleOrDefault(o => (int)o.GetType().GetProperty("Id").GetValue(o,null) == id); 

    }