2016-02-05 64 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

我还将添加,而不是使用行 –

相关问题