C# 实体类型对象不是当前上下文模型的一部分

C# 实体类型对象不是当前上下文模型的一部分,c#,generics,casting,.net-assembly,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&g

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

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

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

当调用
AddItem(item)
时,编译器从参数派生泛型类型并将其替换为方法调用。因为
是object类型(在编译时!)-这就是编译器正在使用的。因此,实际上您正在调用
AddItem(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
方法的类。

如何调用
AddItem
?@Andrei AddItem(item)我不能使用AddItem(item)因为Tipo无法识别,但只要项目类型已知,它就是多余的。
AddItem
是否有非泛型重载?@Andrei这是问题的一部分:我无法指定该项目是Tipo对象。@Andrei否,项目可以是任何类型。它取决于tipoItem字符串。好的,我认为它应该是method。MakeGenericMethod(new[]{Tipo})让我稍等片刻,因为AddItem及其类是静态的。@user1537004,请参见编辑-对于静态方法,
Invoke
的第一个参数应该是
null
。还要注意绑定标志。在第二行“对象引用未设置为对象的实例”中抛出异常。有趣的是,以前的版本(编辑之前)抛出异常,但该项已存储。@user1537004,显然找不到相应的方法。顺便问一下,你确定这个方法是静态的吗?在OP中,它未声明为一。
MethodInfo method = typeof(ItemRepository).GetMethod("AddItem", BindingFlags.Public | BindingFlags.Static);
MethodInfo generic = method.MakeGenericMethod("Datos." + tipoItem);
generic.Invoke(null, new object[]{item});