私はこの方法でオブジェクトを作成しています:
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 は Datos.EmailCliente ではなくオブジェクト型であり、それが問題です。
Tipo, Convert.ChangeType(item, Tipo) として (Tipo) を使用してアイテムを Tipo にキャストしようとしましたが、どれも機能しませんでした。
AddItem メソッドが受け入れるようにアイテムをキャストするにはどうすればよいですか。
ティア
編集:
Andrei's answer に基づいて、これは機能しているコードです。
MethodInfo method = typeof(ControlDatos).GetMethod("AddItem");
MethodInfo generic = method.MakeGenericMethod(new[] { Tipo });
generic.Invoke(cd, new object[] { item });
ここで、cd は、AddItem メソッドが定義されているクラス ControlDatos のインスタンスです。