我正在做的事情就像上面的答案:使用反射设置对象属性
动态设置对象属性的值。我有一个函数包装这种功能,它工作得很好。但是,我想让它查看属性类型,看看它是否是某种集合,并将值/对象添加到集合中。
我试图做这样的事情:if (object is ICollection)
问题是VS2010希望我输入我不知道如何以编程方式做的集合。
所以我想做的是像下面这样给定subject
是目标对象,value
是要设置的值:
public void setPropertyOnObject(object subject, string Name, object value)
{
var property = subject.GetType().GetProperty(Name)
// -- if property is collection ??
var collection = property.GetValue(subject, null);
collection.add(value)
// -- if propert is not a collection
property.SetValue(subject, value, null);
}
您可以动态地检查类型化集合(并向其添加项):
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
Object subject = new HasList();
Object value = "Woop";
PropertyInfo property = subject.GetType().GetProperty("MyList", BindingFlags.GetProperty | BindingFlags.Instance | BindingFlags.Public);
var genericType = typeof (ICollection<>).MakeGenericType(new[] {value.GetType()});
if (genericType.IsAssignableFrom(property.PropertyType))
genericType.GetMethod("Add").Invoke(property.GetValue(subject, null), new[] { value });
}
}
internal class HasList
{
public List<String> MyList { get; private set; }
public HasList()
{
MyList = new List<string>();
}
}
}