Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在C中访问泛型类型的元素#_C#_Entity Framework_Entity Framework 4 - Fatal编程技术网

C# 如何在C中访问泛型类型的元素#

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

我正在研究一种可重用的数据库存储库方法,用于使用EntityFramework 4.3将实体附加和保存到数据库

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