创建委托以常规修改类型为 ICollection <T>的属性/字段



假设我有一个简单的类,如下所示:

public class SimpleClass
{
public List<SomeOtherClass> ListOfStuff { get; } = new List<SomeOtherClass>();
}

SimpleClass本身并不重要,假设我已经询问了该类型并确定出于某种原因它感兴趣,所以我所拥有的只是System.Type对象。现在假设我想访问实现ICollection<T>的类上的任何非静态属性/字段(即ListOfStuffSimpleClass(。我可以访问/创建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:我正在使用Expressions 创建该类型的实例,并考虑使用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 });

相关内容

  • 没有找到相关文章

最新更新