我在创建通用删除方法时遇到问题,甚至不确定是否可能。我有一个删除方法,它将根据实体类型和行ID值(pk)从db中删除记录, 这工作正常,但它需要提前知道类型。在某些情况下,我只能得到对象 在运行时使用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
}
所以我试图将其转换为Delete(对象EntityType,long 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(target,pkey,null); 对象目标是特定类型的actaul实例,我在调用方法中从对象类型和使用反射并传递给此函数,但我仍然不知道它在运行时是什么类型。
如果有人可以提供帮助,我们将不胜感激。
答案 0 :(得分:1)
听起来你应该按照以下方式做点什么:(抱歉,无法测试以确保它按照书面形式运行。)
object o = itemType.GetProperty(PrimaryKeyName);
MethodInfo mi = o.GetType().GetMethod("SetValue");
mi.Invoke(o, new object [] { Id, null });