如何通过 C# 中的反射将基本类型实例附加到列表

本文关键字:实例 类型 列表 何通过 反射 | 更新日期: 2023-09-27 18:33:31

这是我们正在进行的自定义ORM功能。这并不令人敬畏,但这是我们决定要做的事情。

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

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

例如。

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

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

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

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

我需要使用派生类型t创建一个列表lt(即动态创建和填充List<Blah2>(并将其分配给类型为 Blah 的字段:

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

请注意,因为这都是通过反射完成的,所以我拥有的对象类型是:t -> Typei -> Entityf -> FieldInfol -> List<Entity>

如何通过 C# 中的反射将基本类型实例附加到列表

我建议您创建一个帮助程序类,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);