使用对象和程序集的字符串名称

时间:2016-02-05 03:54:01

标签: vb.net object reflection assemblies

我对反思并不好,我希望我选择了正确的类别。我有一个有趣的问题。我使用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”?

1 个答案:

答案 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