2011-09-27 11 views
0

これが可能な場合でも、一般的な削除メソッドの作成に問題があります。私は、エンティティの種類と行IDの値(pk)に基づいてレコードを削除する削除メソッドを持っている それは大丈夫が動作するが、事前に型を知る必要があります。場合によっては、オブジェクト をObject.GetType()を使用して実行時に(viewstateなどから)取得することができ、それは問題が始まるときです。ここでは、型がわかっているときに動作する私のメソッドは、Tの代わりにObject.GetType()を使用するようにそれを変更する方法はありますか?asp.netのエンティティへのLinqと一般的な削除メソッド

  public void Delete<T>(long Id) where T : class,new() 
    { 

     #region PerformaneMonitor 

     IDbEntities Db=null; 
     T item=null; 

     try 
     { 
      Db = this.GetDatabase(); 

      item = new T(); 
      Type itemType = item.GetType(); 

      EntityContainer entityContainer = Db.MetadataWorkspace.GetEntityContainer(Db.DefaultContainerName, DataSpace.CSpace); 

      var entity = entityContainer.BaseEntitySets.First(b => b.ElementType.Name == itemType.Name); 

      if (entity.ElementType.KeyMembers.Count == 0) 
      { 
       throw new Exception("Unable to delete a record witout unique id"); 
      } 

      string PrimaryKeyName = entity.ElementType.KeyMembers[0].Name; 


      itemType.GetProperty(PrimaryKeyName).SetValue(item, Id, null); 
     } 
     catch (Exception ex) 
     { 
      Close(Db); 
      throw(ex); 

     } 

     this.Delete<T>(item, Db); 
     Close(Db); 



     #region PerformaneMonitor 


    } 

だから私はそれを削除(オブジェクトのEntityType、長いID)に変換しようとしていますが、運はありません。私は にこのライン 'オブジェクトがターゲット型と一致しない' 取得しています

public void Delete(object target,long Id) 
    { 

     #region PerformaneMonitor 

     IDbEntities Db = null; 

     try 
     { 
      Db = this.GetDatabase(); 

      Type itemType = (Type)target; 

      EntityContainer entityContainer = Db.MetadataWorkspace.GetEntityContainer(Db.DefaultContainerName, DataSpace.CSpace); 

      var entity= entityContainer.BaseEntitySets.First(b => b.ElementType.Name == itemType.Name); 

      if (entity.ElementType.KeyMembers.Count == 0) 
      { 
       throw new Exception("Unable to delete a record witout unique id"); 
      } 

      string PrimaryKeyName = entity.ElementType.KeyMembers[0].Name; 



      itemType.GetProperty(PrimaryKeyName).SetValue(target, Id, null); 
     } 
     catch (Exception ex) 
     { 
      Close(Db); 
      throw (ex); 

     } 


     this.Delete(target, Db); 

     Close(Db); 

     //_method_tag_end_ 

     #region PerformaneMonitor 


    } 

::のようにここで

はそれが見えるもの itemType.GetProperty(PrimaryKeyName).SetValue(ターゲット、PKEY、null)を。 オブジェクトターゲットは特定の型のactaulインスタンスです。これはオブジェクトの型からの呼び出しメソッドで行い、リフレクションを使用してこの関数に渡しますが、実行時にはどの型か分かりません。

誰かが助けてくれれば幸いです。あなたはこれらの線に沿って何かを行う必要がありますようですね

答えて

1

:(。申し訳ありませんが、書かれた通りに動作することを確認するためにテストすることはできません)

object o = itemType.GetProperty(PrimaryKeyName); 
MethodInfo mi = o.GetType().GetMethod("SetValue"); 
mi.Invoke(o, new object [] { Id, null }); 
関連する問題