假设我有一个简单的类,如下所示:
public class SimpleClass
{
public List<SomeOtherClass> ListOfStuff { get; } = new List<SomeOtherClass>();
}
SimpleClass
本身并不重要,假设我已经询问了该类型并确定出于某种原因它感兴趣,所以我所拥有的只是System.Type
对象。现在假设我想访问实现ICollection<T>
的类上的任何非静态属性/字段(即ListOfStuff
SimpleClass
(。我可以访问/创建SimpleClass
的实例,也可以动态创建集合所由的任何内容组成的实例,但是如何动态(并尽可能高效地(清除或将项目添加到ListOfStuff
?
基本上,我希望能够创建以后可以调用的委托,我可以将感兴趣类型的实例传递给该委托,并且该方法将清除该实例上的特定属性/字段。 同样,我想要另一个委托,我也可以将集合项的实例传递给该委托(例如SomeOtherClass
在上面的示例中(,它会将其添加到属性上的集合中。
我有我感兴趣的类的System.Type
,我有我感兴趣的字段的PropertyInfo
/FieldInfo
,我可以创建类和集合中使用的项的实例。
例如(这不是真正的代码!
Type type = typeof(SimpleClass);
...
// CreateNew is a method that somehow returns a new instance of a type
object test = CreateNew(type);
// GetCollections somehow returns properties/fields that implement ICollection<>
foreach(var collection in GetCollections(type))
{
// CreateNewCollectionItem somehow returns a new instance of the item used in the collection
object newItem = CreateNewCollectionItem(collection);
// how do I implement these two lines?
var clear = Delegate.CreateDelegate(...);
var add = Delegate.CreateDelegate(...);
...
clear(test);
add(test, newItem);
}
我怎样才能让这些代表?
更新:也许我应该说"产生这些代表的最佳/最有效的方法是什么",而不是简单的"如何"。我确定我可以编写一些代码来做必要的事情,但是我可以使用一些魔法来改进我的代码吗? 也许Expression
?
更新 2:我正在使用Expression
s 创建该类型的实例,并考虑使用DynamicMethod
甚至TypeBuilder
来创建我的委托,因为我没有跟上Expression
的速度。有没有人对这些有任何指导/帮助程序类,因为生成它们的代码并不完全可读......?
使用typeof(ICollection<>).MakeGenericType()
获取接口以ICollection<T>
,然后反射以调用它:
var addMethod = typeof(ICollection<>).MakeGenericType(type).GetMethod("Add");
var clearMethod = typeof(ICollection<>).MakeGenericType(type).GetMethod("Clear");
clearMethod.Invoke(collection, new object[0]);
addMethod.Invoke(collection, new object[] { test });