C# 如何在C中访问泛型类型的元素#
我正在研究一种可重用的数据库存储库方法,用于使用EntityFramework 4.3将实体附加和保存到数据库C# 如何在C中访问泛型类型的元素#,c#,entity-framework,entity-framework-4,C#,Entity Framework,Entity Framework 4,我正在研究一种可重用的数据库存储库方法,用于使用EntityFramework 4.3将实体附加和保存到数据库 private void SaveObject<T>(T entityToSave, DbSet<T> dbSet) where T : class { if (db.Entry(entityToSave).State == EntityState.Detached) { if (entit
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;
}
}
private void SaveObject(T entityToSave,DbSet DbSet),其中T:class
{
if(db.Entry(entityToSave.State==EntityState.Detached)
{
if(entityToSave.Id==Guid.Empty)//如何访问Id属性?
dbSet.Add(entityToSave);
其他的
db.Entry(entityToSave).State=EntityState.Modified;
}
}
我遇到的问题是,我需要告诉我的方法哪个属性是Id,这样我就可以检查它是否被设置了。如果它是空的,那么我知道我正在创造一个全新的记录。否则,我将修改现有记录
如何告诉我的方法Id属性是什么?您需要创建一个包含
Id
属性的接口
让您的所有实体类实现这个接口,并约束T
来实现它。(其中T:IHasId
)然后,您将能够在方法中访问此接口的所有成员。您需要一个定义
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;
}
}
公共接口的可扩展性
{
Guid Id{get;}
}
私有void SaveObject(T entityToSave,DbSet DbSet),其中T:class,IEntity
{
if(db.Entry(entityToSave.State==EntityState.Detached)
{
if(entityToSave.Id==Guid.Empty)//如何访问Id属性?
dbSet.Add(entityToSave);
其他的
db.Entry(entityToSave).State=EntityState.Modified;
}
}
如其他人所示,您可以通过使用接口来解决问题。另一种可能是定义访问器委托
private void SaveObject<T>(T entityToSave, DbSet<T> dbSet, Func<T,Guid> accessId)
{
...
Guid id = accessId(entityToSave);
...
}
与接口相比的优点是,ID可以有不同的名称,并且,再加上第二个泛型参数,甚至可以有不同的类型
private void SaveObject<T,I>(T entityToSave, DbSet<T> dbSet, Func<T,I> accessId)
{
...
I id = accessId(entityToSave);
...
}
private void SaveObject(T entityToSave、DbSet DbSet、Func accessId)
{
...
I id=accessId(entityToSave);
...
}
private void SaveObject<T,I>(T entityToSave, DbSet<T> dbSet, Func<T,I> accessId)
{
...
I id = accessId(entityToSave);
...
}