Исключение, добавляющее элемент в свойство observablecollection динамической переменной - PullRequest
0 голосов
/ 21 февраля 2012

Я реализую гибкий процессор для динамического создания некоторых данных с помощью шаблонного подхода. Все работает хорошо, пока ... Мне нужно добавить элементы в ObservableCollection<item>, и я ссылаюсь на объект, содержащий коллекцию, как на динамический.

Итак, у меня есть это:

dynamic componentItem = Activator.CreateInstance(targetType);

targetType (UxBillingLineItem) содержит это свойство, которое инициализируется в конструкторе по умолчанию:

public ObservableCollection<UxBillingLineItem> ComponentServices { get; set; }

(Вложение преднамеренное)

Я создаю элемент для добавления в эту коллекцию:

object comp = Activator.CreateInstance(targetType);

Затем я делаю это, чтобы добавить это:

componentItem.ComponentServices.Add(comp);

Но я получаю это исключение: The best overloaded method match for 'System.Collections.ObjectModel.Collection<UxBillingLineItem>.Add(UxBillingLineItem) имеет недопустимые аргументы "

Редактировать ... Я смотрел на Convert.ChangeType(comp, targetType), но он по-прежнему возвращает объект, а не targetType и возвращает ту же ошибку.
Также посмотрел:

public T ConvertType<T>(object input)
{
  return (T)Convert.ChangeType(input, typeof(T));
}

но для этого все еще нужен тип во время компиляции, а не переменная.

Ответы [ 2 ]

1 голос
/ 21 февраля 2012

Проблема возникает потому, что вы не можете добавить System.Object к строго типизированному ObservableCollection<UxBillingLineItem>.Чтобы решить эту проблему, ваша переменная comp должна быть набрана как UxBillingLineItem. например :

UxBillingLineItem comp = (UxBillingLineItem)Activator.CreateInstance(targetType); 
0 голосов
/ 22 февраля 2012

Николь Калиною дала лучший ответ - дженерики. Я изменил свой метод, чтобы использовать универсальный тип, и все работает как ожидалось.

личный список <T> CreateBillingItemsFromMap <T> (ref RatingData ratingData, динамический processMap, Hashtable propertyMap), где T: new ()

...