c#实体框架-泛型解决方案

c#实体框架-泛型解决方案,c#,entity-framework,generics,C#,Entity Framework,Generics,以下代码是否有泛型解决方案 public static int SaveReorder(IList<int> listItems) { int result = 0; int order = 1; Entity1 db = null; using (ObjectContext context = new ObjectContext()) { foreach (int id

以下代码是否有泛型解决方案

public static int SaveReorder(IList<int> listItems)
    {
        int result = 0;
        int order = 1;
        Entity1 db = null;

        using (ObjectContext context = new ObjectContext())
        {
            foreach (int id in listItems)
            {
                db = Get(context, id);
                db.Order = order;
                context.SaveChanges();
                order += 1;
            }
            result = 1;
        }
        return result;
    }
publicstaticintsavereorder(IListListItems)
{
int结果=0;
整数阶=1;
entity1db=null;
使用(ObjectContext=new ObjectContext())
{
foreach(列表项中的int-id)
{
db=Get(上下文,id);
db.Order=订单;
SaveChanges();
订单+=1;
}
结果=1;
}
返回结果;
}
listItems包含标识符的有序序列。 Entity1是我们EDM中的EntityObjects之一。 Get(…)是同一类中的自定义方法,用于根据当前ObjectContext和Id获取EntityObject

我们希望为这个实现提供一个通用的解决方案,这样我们就可以将它应用于几个EntityObjects,其中属性“Order”是所有EntityObjects的公共属性。这可能吗?

不,但是在未来的C#4.0中,使用动态关键字可以做到这一点

使用订单属性实现接口

目前,每个类都可以实现一个带有order属性的接口,我不知道如何在EDM中实现,但这并不困难


我们经常遇到这种问题,这就是为什么C#采用动态类型,我们依赖于接口或反射。

正如Akash所建议的,我们想到了两个选项:

  • 让实体实现具有“Order”属性的接口:

    接口IEntityOrder{int Order{get;set;}

    分部类Entity1:EntityObject{}

    分部类Entity1:IEntityOrder{public int Order{get;set;}

  • 或者使用反射设置“Order”属性的值(如果是字段,则为FieldInfo):

    PropertyInfo pi=db.GetType().GetProperty(“顺序”)

    pi.SetValue(db,newValue,null)


    • 好的。谢谢你的回答。 这是我的解决办法

      public static int SaveReorder<T>(IList<int> listItems) where T : EntityObject
          {
              int result = 0;
              int volgorde = 1;
              T entityObject = null;
      
              using (vgplannewEntities objectContext = new vgplannewEntities())
              {
                  try
                  {
                      foreach (int id in listItems)
                      {
                          entityObject = objectContext.GetEntityByKey<T>(id, new String[] { });
                          PropertyInfo pi = entityObject.GetType().GetProperty("Volgorde");
                          pi.SetValue(entityObject, volgorde, null);
                          objectContext.SaveChanges();
                          volgorde += 1;
                      }
                      result = 1;
                  }
                  catch
                  {
                      result = 0;
                  }
              }
              return result;
          }
      
      public static int SaveReorder(IList listItems),其中T:EntityObject
      {
      int结果=0;
      int-volgorde=1;
      T entityObject=null;
      使用(vgplannewEntities objectContext=new vgplannewEntities())
      {
      尝试
      {
      foreach(列表项中的int-id)
      {
      entityObject=objectContext.GetEntityByKey(id,新字符串[]{});
      PropertyInfo pi=entityObject.GetType().GetProperty(“Volgorde”);
      设置值(entityObject,volgorde,null);
      objectContext.SaveChanges();
      volgorde+=1;
      }
      结果=1;
      }
      抓住
      {
      结果=0;
      }
      }
      返回结果;
      }