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

デバッグ時、項目オブジェクトの型は正しいです。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 のインスタンスです。

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 に答える