实体类型Object不是当前上下文的模型的一部分

时间:2013-06-29 15:45:27

标签: c# generics casting .net-assembly

我正在以这种方式创建一个对象:

var assembly = typeof (Cliente).Assembly;
var Tipo = assembly.GetType("Datos." + tipoItem);
var item = Activator.CreateInstance(Tipo);

其中tipoItem是类的名称,Datos是相应的名称空间。

Cliente是同一名称空间中的一个类。

要将对象存储在数据库中,我有以下通用方法:

public void AddItem<TItem>(TItem item) where TItem : class
{
    db.Set<TItem>().Add(item);
    db.SaveChanges();
}

调试时,项目对象的类型是正确的。如果tipoItem是“EmailCliente”,那么项目的类型是Datos.EmailCliente。

AddItem方法接收项目作为Datos.EmailCliente对象,但抛出异常:

“实体类型Object不是当前上下文模型的一部分”

调试时,TItem是object类型而不是Datos.EmailCliente,这就是问题所在。

我确实尝试使用(Tipo)将项目转换为Tipo,如Tipo,Convert.ChangeType(item,Tipo),但这些都不起作用。

如何投射项目以便AddItem方法接受它。

TIA

修改

根据Andrei的回答,这是有效的代码。

MethodInfo method = typeof(ControlDatos).GetMethod("AddItem");
MethodInfo generic = method.MakeGenericMethod(new[] { Tipo });
generic.Invoke(cd, new object[] { item });

其中cd是ControlDatos类的实例,其中定义了AddItem方法。

1 个答案:

答案 0 :(得分:1)

当您调用AddItem(item)时,编译器从参数派生泛型类型并将其替换为方法调用。由于item是object类型(在编译时!) - 这是编译器正在使用的。所以你真的在调用AddItem<object>(item),这会给你错误。

要解决此问题,您必须通过反映调用AddItem

MethodInfo method = typeof(ItemRepository).GetMethod("AddItem", BindingFlags.Public | BindingFlags.Static);
MethodInfo generic = method.MakeGenericMethod("Datos." + tipoItem);
generic.Invoke(null, new object[]{item});

其中ItemRepository是定义AddItem方法的类。