установка скалярного значения для коллекции с помощью самоанализа - PullRequest
0 голосов
/ 22 сентября 2011

Я делаю что-то вроде ответа на: Установить свойство объекта с помощью отражения

Динамическая установка значения свойства объекта. У меня есть функция, упаковывающая такого рода функциональность, и она прекрасно работает. Однако я хочу сделать так, чтобы он смотрел на тип свойства, чтобы увидеть, является ли он какой-то коллекцией, и добавил значение / объект в коллекцию.

Я пытался сделать что-то вроде: 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);
}

1 Ответ

1 голос
/ 23 сентября 2011

Вы можете динамически проверять типизированную коллекцию (и добавлять в нее элемент) следующим образом:

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>();
        }
    }
}
...