2009-08-29 61 views
2

是否有以下代碼的泛型解決方案?c#實體框架 - 泛型解決方案

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

listItems包含一個有序的標識鍵序列。 Entity1是我們EDM中的一個EntityObjects。 Get(...)是在同一個類中根據當前ObjectContext和Id獲取EntityObject的自定義方法。

我們希望爲此實現提供一個通用的解決方案,因此我們可以將它應用於多個EntityObjects,其中屬性「Order」是所有EntityObjects的公共屬性。這可能嗎?

回答

1

兩個選項浮現在腦海中,因爲阿卡什已經提出:

  • 要麼讓實體將執行與「秩序」屬性的接口:

    接口IEntityOrder {INT訂單{獲得;組; }}

    部分類ENTITY1:EntityObject {}

    部分類ENTITY1:IEntityOrder {公衆詮釋訂單{獲得;組; }}

  • 或者使用反射來設置 '訂單' 屬性的值(或字段信息,如果它是一個場):

    的PropertyInfo PI = db.GetType()的getProperty( 「訂單」);

    pi.SetValue(db,newValue,null);

1

不,但是在將來使用動態關鍵字的C#4.0中,您可以這樣做。

與順序屬性

實現接口目前你可以有每個類實現順序屬性的界面,我不知道如何在EDM做到這一點,但它不應該是困難的。

我們遇到這樣的問題很多,這就是爲什麼C#與動態類型一起出現,我們依靠接口或反射。

0

好的。謝謝你的回答。 這是我的解決方案。

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