2012-02-21 100 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:新的()