我正在以这种方式创建一个对象:
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方法。
答案 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
方法的类。