我正在做类似答案: Set object property using reflection
动态设置对象属性的值。我有一个功能包装这种功能,它很棒。但是,我想让它查看属性类型以查看它是否是某种集合并将值/对象添加到集合中。
我尝试做类似的事情: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);
}
答案 0 :(得分:1)
您可以动态检查已键入的集合(并向其添加项目):
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>();
}
}
}