Использование Reflection для вызова метода свойства - PullRequest
11 голосов
/ 21 марта 2011

То, что я пытаюсь сделать, это вызвать метод свойства, используя 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

У кого-нибудь есть совет?

Спасибо

Ответы [ 3 ]

15 голосов
/ 21 марта 2011

Это было быстро ... Я изменил строку Invoke на ...

m.Invoke(p.GetValue(newControl, null), new object[] { newValue });

... и это сработало: P

5 голосов
/ 21 января 2012

@ acron, спасибо за отличный вопрос и ответ.Я хочу расширить ваше решение для немного другого сценария для всех, кто смотрит в будущее.

Столкнувшись с подобной проблемой в мире ASP.NET, я пытался найти общий способ загрузки системы ..Web.UI.Webcontrols.DropDownList ИЛИ System.Web.UI.HtmlControls.HtmlSelect В то время как оба они имеют свойство «Items» типа «ListItemCollection» с соответствующим «Add»метод, они не разделяют общий интерфейс (, поскольку они ДОЛЖНЫ ... эй, Microsoft ... ), чтобы можно было использовать приведение.

Дополнительная проблема, которую ваше решение не сделалоОбеспечить перегрузку метода Add.

Без перегрузок ваша строка: MethodInfo m = p.PropertyType.GetMethod(methodName); работает просто отлично.Но когда метод Add перегружен, вызывается дополнительный параметр, чтобы среда выполнения могла определить, какую перегрузку следует вызвать.

MethodInfo methInfo = propInfo.PropertyType.GetMethod("Add", new Type[] { typeof(ListItem) });

1 голос
/ 21 марта 2011

Полученная ошибка указывает на то, что данное свойство доступно только для чтения. Определенный метод не определен. Вы не сможете установить значение для свойства без установщика.

Отправьте сообщение с названием объекта или дополнительным контекстом, и мы сможем дать вам лучший ответ или альтернативу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...