【问题标题】:Using a string name for an object and an assembly对对象和程序集使用字符串名称
【发布时间】:2016-02-05 03:54:01
【问题描述】:

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

【问题讨论】:

  • 你已经用s(一种统计编程语言)标记了这个问题,但这看起来很像Visual Basic。这需要重新标记吗?
  • 感谢您指出。完毕。只是在键盘上随意点击一下:-)

标签: vb.net object reflection assemblies


【解决方案1】:

方法如下:

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

【讨论】:

  • 谜,​​谢谢你的回答。我想我会一次采用一种方法。所以我正在尝试你的第一种方法。以下是一些似乎不起作用的事情。 1.您将 List (of ) 后面的类型名称留空。我不确定您是否遗漏了类型名称并希望我知道要输入什么。我不能真正输入任何内容,因为该类型是我要创建的。我需要创建“DLL.Report.ListData”类型的类型变量。现在我所拥有的只是指向 Type1 中该类型的指针。在任何情况下,缺少类型名称的事实都会导致编译错误。
  • 我试图将对象放入:列表(对象)。这摆脱了编译错误。然后发生的事情是,在运行时,我收到一个错误,告诉我可以使用 MakeGenericType 因为 Type1 不是泛型类型,它不是:-)。对于我遗漏的任何信息,我深表歉意。我正在努力理解这一切。
  • 我也会添加它而不是使用该行
  • :System.Reflection.Assembly.LoadWithPartialName("DLL.Report").GetType("DLL.Report.ListData") 获取我正在使用的指针类型
  • 就在我回答了最后一个问题之后,我突然想到我可能需要为泛型导入一个命名空间。我是对的。这让我克服了我的问题。谢谢!!!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-05-28
  • 1970-01-01
  • 1970-01-01
  • 2020-08-16
  • 1970-01-01
  • 2019-05-04
  • 1970-01-01
相关资源
最近更新 更多