我对反思并不好,我希望我选择了正确的类别。我有一个有趣的问题。我使用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")
它在变量type1中返回一个sytem.type,而不是类型DLL.Report.ListData。在该变量中有两个属性:Name =“ListData”和FullName =“DLL.Report.ListData”。我能够使用type1中的一些方法来获取DLL.Report.ListData的属性,因此type1似乎是一个指向DLL.Report.ListData的指针。 我的问题是我需要一个DLL.Report.ListData类型的变量。有没有办法获取Fullname字符串并返回类型DLL.Report.ListData而不是“system.type”?
答案 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