2011-09-27 27 views
0

我在創建通用刪除方法時遇到了麻煩,甚至不知道這是否可能。我有一個刪除方法,它將根據實體類型和行ID值(pk), 刪除數據庫中的記錄,它工作正常,但它需要事先知道類型。在某些情況下,我只能在運行時使用Object.GetType()(類似viewstate)獲取對象 的類型,這是故障開始時的情況。這裏是我知道類型的方法,有沒有辦法修改它,以便它將使用Object.GetType()而不是T?LINQ到asp.net中的實體和通用刪除方法

  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(目標,p鍵,NULL); 對象目標是特定類型的actaul實例,我在調用方法中從對象類型執行並使用反射並傳遞給此函數,但我仍然不知道它在運行時是何種類型。

如果有人能幫助它,將不勝感激。

回答

1

這聽起來像你應該做的東西沿着這些路線:(對不起,不能測試,以確保它可以作爲書面)。

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