2012-05-13 53 views
2

我正在研究一种可重复使用的数据库存储库方法,用于使用EntityFramework 4.3将实体附加和保存到数据库。如何访问C#中的泛型类型的元素

private void SaveObject<T>(T entityToSave, DbSet<T> dbSet) where T : class 
    { 
     if (db.Entry(entityToSave).State == EntityState.Detached) 
     { 
      if (entityToSave.Id == Guid.Empty) // how do I access the Id property? 
       dbSet.Add(entityToSave); 
      else 
       db.Entry(entityToSave).State = EntityState.Modified; 
     } 
    } 

,我快到的问题是,我要告诉我的方法,它的属性是ID,这样我可以检查,看它是否设置与否。如果它是空的,那么我知道我正在创造一个全新的纪录。否则,我正在修改现有的记录。

如何告诉我的方法Id属性是什么?

回答

3

您需要一个接口或基类来定义Id属性,并将其用作通用约束。例如:

public interface IEntity 
{ 
    Guid Id { get; } 
} 

private void SaveObject<T>(T entityToSave, DbSet<T> dbSet) where T : class, IEntity 
    { 
     if (db.Entry(entityToSave).State == EntityState.Detached) 
     { 
      if (entityToSave.Id == Guid.Empty) // how do I access the Id property? 
       dbSet.Add(entityToSave); 
      else 
       db.Entry(entityToSave).State = EntityState.Modified; 
     } 
    } 
3

您需要创建一个包含Id属性的接口。

使所有实体类都实现此接口并约束T来实现它。 (where T : IHasId
然后,您将能够在您的方法中访问此界面的所有成员。

1

正如其他人所示,您可以通过使用接口来解决问题。另一种可能性是定义一个访问委托

private void SaveObject<T>(T entityToSave, DbSet<T> dbSet, Func<T,Guid> accessId) 
{ 
    ... 
    Guid id = accessId(entityToSave); 
    ... 
} 

电话与

SaveObject(entityToSave, dbSet, e => e.Id) 
SaveObject(otherEntityToSave, dbSet, e => e.UserID) 

的优势的接口,就是IDS可以有不同的名称,并与第二泛型参数在一起,甚至是不同的类型

private void SaveObject<T,I>(T entityToSave, DbSet<T> dbSet, Func<T,I> accessId) 
{ 
    ... 
    I id = accessId(entityToSave); 
    ... 
}