从.NET中的字符串中获取Type对象

时间:2012-10-22 13:41:50

标签: vb.net

我有一个带控件定义的xml

 <?xml version="1.0" encoding="utf-8"?>
  <Controls>
   <TabControl>
     <Properties>
      <Dock>5</Dock>
     </Properties>
     <TabPage>
      <TextBox>
       <Properties>
        <Text>Id:</Text>
        <Location>106,12</Location>
        <Size>113,20</Size>
        <BorderStyle>2</BorderStyle>
       </Properties>
      </TextBox>
      <MyControl>
       <Properties>
        <Visible>True</Visible>
        <Location>106,33</Location>
        <Size>113,20</Size>
        <Enabled>True</Enabled>
        <BorderStyle>2</BorderStyle>
        <Text>Action:</Text>
        <TabIndex>0</TabIndex>
       </Properties>
      </MyControl>
     <Properties>
      <Text>Details</Text>
     </Properties>
    </TabPage>
   </TabControl>
  </Controls>

确定。正如您所看到的,我在此示例中有一个tabControl,其中包含一个TabPage。 TabPage有一个TextBox和一个MyControl。

我能够读取xml并添加除MyControl之外的所有控件。 原因是我找不到这种类型。 说明: 为了运行xml并添加控件,我想找到它的类型。所以我使用这行代码:

   Dim oType As Type = FindType("System.Windows.Forms." & elem.Name.ToString)

FindType是我在这里找到的一个函数:Best way to get a Type object from a string in .NET

不幸的是我无法弄清楚要在此函数中添加什么来查找MyControl。 MyControl只是添加到我的解决方案中的自定义控件。

我知道我可以在FindType函数中使用if

    if base is Nothing then
      if name.Contains("MyControl")Then
            base = GetType(MyControl)
        End If
    End If
      If base IsNot Nothing Then Return base

我的问题是我有3个自定义控件,将来我可能会添加更多。 有什么方法可以通用吗?

另一个问题是在FindType函数中我必须使用“System.Windows.Forms”。为了这个名字。 我发现没有它,该功能不会返回任何东西。 我想这是因为我在构建表单时调用了该函数,所以并不是所有内容都被加载了吗?

感谢您的时间

3 个答案:

答案 0 :(得分:2)

System.Windows.Forms命名空间。它习惯于属于一起的类。例如,与Windows窗体相关的所有内容都包含在System.Windows.Forms命名空间中。您的类位于项目命名空间中,这就是为什么在使用System.Windows.Forms作为前缀时找不到它们。

要了解有关命名空间的更多信息,请查看此old, but still valid MSDN article

现在,让我们回到你的问题。一个简单的解决方案是首先查看System.Windows.Forms命名空间,然后查看您自己的命名空间:

Function FindTypeEx(typeName As String) As Type
    Dim type = FindType("System.Windows.Forms." & typeName)
    If type Is Nothing Then
        type = FindType(typeName)   ' Without the prefix
    End If
    Return type
End Function

答案 1 :(得分:1)

如果FindType("System.Windows.Forms." & elem.Name.ToString)找不到任何内容,请尝试FindType(elem.Name.ToString)

看起来你链接的问题中FindType的代码应该找到它,如果你只传递名称,因为它会查看正在执行的程序集中的所有类型。

答案 2 :(得分:0)

那是因为没有System.Windows.Forms.MyControl类 您需要为每个类确定正确的命名空间。