1

.net 3.5のみを使用して、サンプルクラスがあります:

public class Table1
{
   public IEnumerable<Table2> Items { get; set; }
}

それは一種のORMであり、遅延計算型によるコレクションを具体化する必要があります

たとえば、インスタンスをプロパティItemsに割り当てる方法を見つけようとしています List<Table2>

Activator でインスタンスを作成すると、必要な型にキャストできないオブジェクトが返されます

var t = typeof(List<>);
var gt = t.MakeGenericType(typeof(Table2));
object instance = Activator.CreateInstance(gt);

var table1 = new Table1();
table1.Items = instance; //canot use cast here

そして、「オブジェクト」変数を型付きIEnumerableに割り当てる問題です

ほとんどの OR-mapper でどのように機能しますか?

Reflection.Emit を使用して具象型を生成できますか?
Castle/Linfu を使用できますか?

編集:

ハーコードできない参照Table2が必要なため、直接キャストを使用できません

解決:

しばらくして、自分で解決策を見つけました。セット インスタンスにリフレクションを使用する必要があります。

var table1 = new Table1();
var table1Type = typeof(Table1);
var prop = table1Type.GetProperty("Items");
prop.SetValue(table1, instance, null);
4

2 に答える 2

0

リストが必要なことがわかっている場合は、なぜ使用できないのでしょnew List<Table2>()うか? 一般にActivator.CreateInstance、実行時まで型がわからない場合にのみ使用し、多くの場合、文字列ベースの構成値を使用します。

ただし、行う必要があるのは、またはのinstanceいずれかに明示的にキャストすることだけで、どちらも機能するはずです。IEnumerable<Table2>List<Table2>

table1.Items = (IEnumerable<Table2>) instance;
于 2012-04-30T21:16:12.957 に答える
0

単純なキャストが欠けているだけだと思います:

それ以外の:

table1.Items = instance;

成功する:

table1.Items = instance as IEnumerable<Table2>;
于 2012-04-30T21:12:01.027 に答える