如何通过 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
-> Type
、 i
-> Entity
、f
-> FieldInfo
、l
-> List<Entity>
。
我建议您创建一个帮助程序类,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);