Linq到asp.net中的实体和通用删除方法

Linq到asp.net中的实体和通用删除方法,linq,generics,Linq,Generics,我在创建泛型删除方法时遇到问题,甚至不确定这是否可能。我有一个删除方法,它将根据实体类型和行id值(pk)从数据库中删除记录, 这样可以,但需要提前知道类型。在某些情况下,我只能获取对象 在运行时使用Object.GetType()键入(就像从viewstate中),这时问题就开始了。这是我的方法,当类型已知时可以工作,有没有办法修改它,使它使用Object.GetType()而不是T public void Delete<T>(long Id) where T :

我在创建泛型删除方法时遇到问题,甚至不确定这是否可能。我有一个删除方法,它将根据实体类型和行id值(pk)从数据库中删除记录, 这样可以,但需要提前知道类型。在某些情况下,我只能获取对象 在运行时使用Object.GetType()键入(就像从viewstate中),这时问题就开始了。这是我的方法,当类型已知时可以工作,有没有办法修改它,使它使用Object.GetType()而不是T

         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


    }
我在上得到“对象与目标类型不匹配” 这一行: itemType.GetProperty(PrimaryKeyName).SetValue(target,pkey,null); 对象目标是特定类型的actaul实例,我在从对象类型调用方法中使用反射和传递到该函数,但我仍然不知道它在运行时是什么类型


如果有人能帮上忙,我们将不胜感激。

听起来你应该按照以下思路做一些事情:(对不起,无法测试以确保它按书面形式工作。)

  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


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