2009-08-29 8 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 identitykeysの順序付けられたシーケンスが含まれています。 Entity1は、EDMのEntityObjectの1つです。 Get(...)は、現在のObjectContextとIdに基づいてEntityObjectを取得するための、同じクラス内のカスタムメソッドです。

この実装の汎用ソリューションが必要なので、これをいくつかのEntityObjectに適用できます。プロパティ 'Order'はすべてのEntityObjectの共通プロパティです。これは可能ですか?

答えて

1

つのオプションは、頭に浮かぶ:

  • どちらの事業体が「注文」プロパティとのインタフェースを実装してみましょう:

    インタフェースIEntityOrder {int型の注文{取得します。セット; }}

    パーシャルクラスEntity1:EntityObject {}

    パーシャルクラスEntity1:IEntityOrder {公共のint型の注文{取得します。セット; (それはフィールドだ場合またはのFieldInfo)}}

  • または使用の反射は '注文' プロパティの値を設定します。

    PropertyInfo PI = db.GetType()のGetProperty( "注文");

    pi.SetValue(db、newValue、null);

1

いいえ、今後の動的キーワードを使用するC#4.0ではこれを行うことができます。

注文プロパティで実装インタフェース

あなたが各クラスによって実装されるためのプロパティとインタフェースを持つことができ、現在、私はEDMでこれを行う方法がわからないのですが、それは難しいことはずの。

私たちはこの種の問題を多く受けています。なぜなら、C#が動的なタイプになっているからです。私たちは、インターフェースやリフレクションに依存しています。 Akashさんがすでに示唆したように

0

OK。あなたの答えはどれも大丈夫です。 私の解決方法は次のとおりです。

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; 
    } 
関連する問題