2016-02-05 65 views
0

我不善於反思,我希望我選擇了正確的類別。我有一個有趣的問題。我使用devexpress報告撰寫了一份報告。這涉及到行的這樣的代碼:爲對象和程序集使用字符串名稱

lxListData = New System.Collections.Generic.List(Of DLL.Report.ListData) 

的ListData是在裝配報告外部到其中執行上述行的一個。上面的行工作正常,並允許我運行報告。

我所做的是什麼把所有的信息,本報告到一個表作爲字符串,其中包括類型:「DLL.Report.ListData」

我需要的是改變這個字符串名稱進入類型用於上面的代碼行中。我曾嘗試:

Dim type1 As Type = System.Reflection.Assembly.LoadWithPartialName("DLL.Report").GetType("DLL.Report.ListData") 

,然後改變以上線路:

lxListData = New System.Collections.Generic.List(Of type1) 

我已經試過了類似於一些其他技術。在所有情況下,即使它看起來像在監視窗口中,「type1」變量也不會被視爲一種類型。

任何意見,將不勝感激。

感謝, 尼爾

我已經做了一些研究,發現這一行:

Dim type1 As Type = System.Reflection.Assembly.LoadWithPartialName("DLL.Report").GetType("DLL.Report.ListData") 

在變量類型1返回sytem.type,不會打字DLL.Report.ListData 。在該變量中有兩個屬性:Name =「ListData」和FullName =「DLL.Report.ListData」。我能夠使用類型1中的一些方法來獲取DLL.Report.ListData的屬性,因此type1看起來是指向DLL.Report.ListData的指針。 我的問題是我需要一個類型爲DLL.Report.ListData的變量。有沒有辦法取得Fullname字符串並返回類型爲DLL.Report.ListData而不是「system.type」的東西?

+0

你已經用[tag:s](一種統計編程語言)標記了這個問題,但是這看起來很像Visual Basic。這是否需要重新簽名? –

+0

感謝您指出。完成。只是一個流浪的點擊鍵盤:-) –

回答

0

方法如下:

Dim list As IList = _ 
    Ctype(Activator.CreateInstance(GetType(List(Of)).MakeGenericType(type1)), IList) 

請記住,因爲你創建這個在運行時,你不能在編譯時強類型。你可以做的最好的做法是讓這個IList

另一個選項,如果你想使用強類型列表,就是使用反射來調用一個通用的方法。在該方法內完成的工作是強類型的。

Dim mi = Me.GetType().GetMethod("CreateList") 
Dim gmi = mi.MakeGenericMethod(type1) 
Dim list = Ctype(gmi.Invoke(Me, Nothing), IList) 

Public Function CreateList(Of T) As List(Of T) 
    ' Strongly-typed to `T` in here 
    Return New List(Of T)() 
End Function 
+0

Enigmativity,感謝您的答案。我想我一次採取一種方法。所以我正在嘗試你的第一個方法。這些東西似乎並不奏效。 1.列表(of)後留下類型名稱爲空。我不確定你是否忽略了類型名稱,並希望我知道應該輸入什麼內容。我無法真正放入任何內容,因爲我正在嘗試創建類型。我需要創建一個「DLL.Report.ListData」類型的類型變量。現在我所擁有的是指向Type1中的那種類型的指針。在任何情況下,類型名稱缺失的事實都會導致編譯錯誤。 –

+0

我試圖把對象放在:列表(對象)。這擺脫了編譯錯誤。接下來發生的事情是,在運行時,我得到一個錯誤,告訴我可以使用MakeGenericType,因爲Type1不是泛型類型,它不是:-)。對不起,我的部分遺漏了任何信息。我正在努力理解這一切。 –

+0

我還將添加,而不是使用行 –

相關問題