1

これは、私たちが取り組んでいるカスタムORMです。それは素晴らしいことではありませんが、それは私たちがやることに決めたものです。

基本的に、基本クラスEntityは他の任意の数のクラスによって拡張されます。これらの子クラスには、属性を使用して注釈を付ける必要があります。

コレクションという特定のタイプの属性があります。この属性は、コレクションのサブタイプを定義します。

例えば。

public class Blah2 : Entity
{
    ...
}

public class Blah : Entity 
{
    [QRel(Type = typeof(Blah2)]
    public IEnumerable<Blah2> blahs;
}

これらの子オブジェクトのロードは簡単に実行できますが、基本タイプとしてロードされEntityます。

リフレクションを介して、実行時にORMマネージャーで次のようになります。

  • 属性でマークされたタイプ:Type t
  • 何とかフィールド情報:FieldInfo f
  • タイプのエンティティインスタンスBlahi
  • Blah2インスタンスのセットを含む一般的なロード済みリスト:List<Entity> l

lt派生タイプを使用してリストを作成しt(つまり、動的に作成して入力しList<Blah2>)、タイプのフィールドに割り当てる必要がありますBlah

var lt = ...
f.SetValue(i, lt);

これはすべてリフレクションを介して行われるため、私が持っているオブジェクトのタイプtは-> Typei-> Entityf-> FieldInfol- >であることに注意してくださいList<Entity>

4

1 に答える 1

2

ヘルパー クラスを作成することをお勧めします。ヘルパー クラスHelper<T>は、適切に型指定されたジェネリック リストの割り当てを行い、リストにアイテムを入力します。リフレクションのコストを削減するために、ヘルパー クラスのインスタンスをキャッシュできます。

abstract class Helper
{
    public abstract IEnumerable<Entity> CreateList(IEnumerable<Entity> loadedList);
}

sealed class Helper<T> : Helper where T : Entity
{
    public override IEnumerable<Entity> CreateList(IEnumerable<Entity> loadedList)
    {
        return new List<T> (loadedList.OfType<T> ());
    }
}

のインスタンスを作成するには、次のHelper<T>ようにします。

var helperType = typeof (Helper<>).MakeGenericType (t);
var helper = Activator.CreateInstance (helperType) as Helper;

Blah2次に、一般的なリストに基づいてのリストを割り当てて入力します。

var lt = helper.CreateList (l);
于 2012-05-07T03:41:59.567 に答える