2012-02-21 63 views
0

我正在实现一个灵活的处理器,以通过模板方法动态创建一些数据。一切运作良好,直到...我需要添加元素到ObservableCollection<item>,我将包含集合的对象作为动态引用。异常将元素添加到动态变量的observablecollection属性

所以我有这样的:

dynamic componentItem = Activator.CreateInstance(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)); 
} 

,但仍需要一个类型在编译时,而不是一个变量。

+0

你怎么可以肯定的是'targetType'是在两种情况下一样的吗? – Gabe 2012-02-21 18:20:26

+0

targetType是例程的参数。在此之前的过程中,我完成了ProcessMap.TargetType = typeof(UxBillingLineItem);并将该类型传入例程。 – tobewan 2012-02-21 19:33:53

回答

1

发生此问题的原因是您无法将System.Object添加到强类型ObservableCollection<UxBillingLineItem>。要解决这个问题,你的comp变量需要输入为UxBillingLineItem例如

UxBillingLineItem comp = (UxBillingLineItem)Activator.CreateInstance(targetType); 
+0

UxBillingLineItem类型是此例程的参数。所以不可能写出你建议的代码。 – tobewan 2012-02-21 17:58:19

+0

(怪异的5分钟规则..)意图是有一个单一的方法,可以做不同的目标类型的类似处理。所以不可能编写你建议的代码并完成我的目标。我宁愿不必更改各种目标类型的定义以具有ObservableCollection 。 – tobewan 2012-02-21 18:07:43

+0

您的目标类型是否具有除对象之外的通用基本类型?如果没有,为什么你认为你应该能够将它们存储在一个强类型的其他类型的集合中? – 2012-02-21 18:16:13

0

Nicole Calinoiu提供了最好的答案 - 泛型。我修改了我的方法来使用泛型类型,一切都按预期工作。

私人列表<T> CreateBillingItemsFromMap <T>(REF RatingData ratingData,动态processMap,Hashtable的属性映射),其中T:新的()