0

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

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();
}

调试时,item对象的类型是对的。如果tipoItem 为“EmailCliente”,则项目类型为Datos.EmailCliente。

AddItem 方法将项目作为 Datos.EmailCliente 对象接收,但引发异常:

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

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

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

如何转换项目以便 AddItem 方法接受它。

TIA

编辑

根据安德烈的回答,这是有效的代码。

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

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

4

1 回答 1

1

当您调用AddItem(item)时,编译器将从参数派生泛型类型并将其替换为方法调用。因为item是类型对象(在编译时!) - 这就是编译器正在使用的。所以你真的在打电话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方法的类在哪里。

于 2013-06-29T15:59:20.003 回答