Ответ 1
Это было быстро... Я изменил строку Invoke на...
m.Invoke(p.GetValue(newControl, null), new object[] { newValue });
... и он работал: P
То, что я пытаюсь сделать, это вызвать метод свойства, используя Reflection. У меня есть исходный элемент управления (ComboBox), PropertyInfo свойства (ComboBox.Items) и имя метода (ComboBox.Items.Add). Я попробовал код ниже, чтобы получить, изменить, установить, но он не работает, потому что у элементов нет сеттера.
PropertyInfo p = controlType.GetProperty(propertyName); // gets the property ('Items')
MethodInfo m = p.PropertyType.GetMethod(methodName); // gets the method ('Items.Add')
object o = p.GetValue(newControl, null); // gets the current 'Items'
m.Invoke(o, new object[] { newValue }); // invokes 'Add' which works
p.SetValue(newControl, o, null); // exception: 'Items' has no setter
Есть ли у кого-нибудь советы?
Спасибо
Это было быстро... Я изменил строку Invoke на...
m.Invoke(p.GetValue(newControl, null), new object[] { newValue });
... и он работал: P
@acron, Спасибо за отличный вопрос и ответ. Я хочу расширить свое решение для немного другого сценария для тех, кто смотрит в будущее.
Перед аналогичной проблемой в мире ASP.NET я пытался найти общий способ загрузки либо System.Web.UI.Webcontrols.DropDownList ИЛИ a System.Web. UI.HtmlControls.HtmlSelect. Хотя оба они имеют свойство "Items" типа "ListItemCollection", с соответствующим методом "Добавить", они не имеют общего интерфейса (поскольку они ДОЛЖНЫ... эй Microsoft...), чтобы можно было использовать кастинг.
Дополнительная проблема, которую не удалось решить вашему решению, - это перегрузка метода Add.
Без перегрузок ваша строка:
MethodInfo m = p.PropertyType.GetMethod(methodName);
работает просто отлично. Но, когда метод Add перегружен, вызывается дополнительный параметр, так что среда выполнения может идентифицировать, какую перегрузку вызывать.
MethodInfo methInfo = propInfo.PropertyType.GetMethod("Add", new Type[] { typeof(ListItem) });
Ошибка, которую вы получаете, указывает, что рассматриваемое свойство доступно только для чтения. Определенного метода не задано. Вы не сможете установить значение для свойства без установщика.
Отправьте обратно с именем свойства или более контекстом, и мы сможем дать вам лучший ответ или альтернатив.