使用自省设置集合上的标量值



我正在做的事情就像上面的答案:使用反射设置对象属性

动态设置对象属性的值。我有一个函数包装这种功能,它工作得很好。但是,我想让它查看属性类型,看看它是否是某种集合,并将值/对象添加到集合中。

我试图做这样的事情: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>();
        }
    }
}

相关内容

  • 没有找到相关文章

最新更新