1

这是我们正在处理的自定义 ORM 事情。这不是很棒,但这是我们决定要做的。

基本上,基类Entity由任意数量的其他类扩展。这些子类必须使用属性进行注释。

有一种特定类型的属性是集合。该属性定义了集合的子类型。

例如。

public class Blah2 : Entity
{
    ...
}

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

加载这些子对象很容易,但它们是作为基本类型加载的,Entity.

通过反射,所以在运行时我在 ORM 管理器中:

  • 属性中标注的类型:Type t
  • blahs 的字段信息:FieldInfo f
  • 类型的实体实例Blahi
  • 包含一组Blah2实例的通用加载列表:List<Entity> l

我需要lt使用派生类型创建一个列表t(即动态创建和填充 a List<Blah2>)并将其分配给 type 字段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 回答