Vb.net GetType.GetProperties

Vb.net GetType.GetProperties,vb.net,Vb.net,我正在尝试运行面板中的所有控件,并查找用户为每个控件更改了哪些属性 所以我有这个代码: Private Sub WriteProperties(ByVal cntrl As Control) Try Dim oType As Type = cntrl.GetType 'Create a new control the same type as cntrl to use it as the default control

我正在尝试运行面板中的所有控件,并查找用户为每个控件更改了哪些属性

所以我有这个代码:

    Private Sub WriteProperties(ByVal cntrl As Control)

    Try
        Dim oType As Type = cntrl.GetType

        'Create a new control the same type as cntrl to use it as the default control                      
        Dim newCnt As New Control
        newCnt = Activator.CreateInstance(oType)

        For Each prop As PropertyInfo In newCnt.GetType().GetProperties
            Dim val = cntrl.GetType().GetProperty(prop.Name).GetValue(cntrl, Nothing)
            Dim defVal = newCnt.GetType().GetProperty(prop.Name).GetValue(newCnt, Nothing)

            If val.Equals(defVal) = False Then
               'So if something is different....
            End If

        Next
    Catch ex As Exception
        MsgBox("WriteProperties : " &  ex.Message)
    End Try
End Sub
现在我面临三个问题:

  • 当属性引用图像(背景图像)时,我有一个错误: ImageObject引用未设置为对象的实例

  • 第二个问题是代码:

     If val.Equals(defVal) = False Then
               'So if something is different....
     End If
    
    当val和defVal相同时,有时执行is。 如果属性是类似FlatAppearance的“parentProperty”(具有更多子属性),则会发生这种情况

  • 我的循环没有查看我想要的基本属性,如大小或位置


  • Re:
    未设置为对象的实例
    ,请执行以下操作

    If val IsNot Nothing AndAlso defVal IsNot Nothing AndAlso Not val.Equals(defVal) Then
    
    只有当两个值都不是
    Nothing
    (又称
    Null
    )时,才会进行比较

    不幸的是,#2是一个基本问题-
    。默认情况下,Equals会检查两个对象引用是否指向内存中的同一对象,例如,如果您指向了同一对象

    Dim A As New SomeClass
    Dim B As New SomeClass
    
    If A.Equals(B) Then
        ...
    End If
    
    将返回
    False
    ,除非
    SomeClass
    具有重写的相等比较器,而许多类没有

    您可以检查所讨论的值是否是您知道可以比较的类型(整数、字符串、双精度等)。如果没有,您可以遍历它的属性并再次执行相同的检查。这将允许您比较任何类型的公共属性是否相等,但不能保证类的内部状态相同

    类似于(未测试/伪)


    这仍然不理想,因为值的内部状态可能不同。

    Re:
    未设置为对象的实例,请执行以下操作

    If val IsNot Nothing AndAlso defVal IsNot Nothing AndAlso Not val.Equals(defVal) Then
    
    只有当两个值都不是
    Nothing
    (又称
    Null
    )时,才会进行比较

    不幸的是,#2是一个基本问题-
    。默认情况下,Equals会检查两个对象引用是否指向内存中的同一对象,例如,如果您指向了同一对象

    Dim A As New SomeClass
    Dim B As New SomeClass
    
    If A.Equals(B) Then
        ...
    End If
    
    将返回
    False
    ,除非
    SomeClass
    具有重写的相等比较器,而许多类没有

    您可以检查所讨论的值是否是您知道可以比较的类型(整数、字符串、双精度等)。如果没有,您可以遍历它的属性并再次执行相同的检查。这将允许您比较任何类型的公共属性是否相等,但不能保证类的内部状态相同

    类似于(未测试/伪)


    这仍然不理想,因为值的内部状态可能不同。

    Re:“未设置为对象的实例”,请执行以下操作<代码>如果val不为Nothing且also deffal不为Nothing且also Not val.Equals(deffal),则
    。只有当两个值都不是
    Nothing
    aka
    Null
    时,才会进行比较。实际上,您可能会发现,通过使用
    OnChange
    事件和类似的感谢您解决了问题1问题3是我的代码中的问题(不是在这个函数中,所以我解决了问题)在测试TabControl时,我发现属性填充的错误不明确匹配(tabControl有两个TabPages)您知道为什么以及如何跨越它吗?解决了不明确匹配的错误:Re:“未设置为对象的实例”,执行类似于…
    的操作,如果val不是Nothing,那么deffal也不是Nothing,并且也不是val.Equals(deffal)然后
    。只有当两个值都不是
    Nothing
    aka
    Null
    时,才会进行比较。实际上,通过使用
    OnChange
    事件和类似的方法,您可能会发现更容易记下更改的内容。谢谢您解决了问题1问题3是我代码中的问题(不是在这个函数中,所以我解决了它)当我测试一个TabControl(TabControl有两个TabPages)时,我发现属性填充有一个不明确的匹配错误你知道为什么以及如何克服它吗?模糊匹配的错误已解决:非常感谢。我将尝试一下,看看是否面临问题。当我测试TabControl时,我发现属性填充的错误模糊匹配(TabControl有两个TabPages)你知道为什么以及如何克服它吗?模糊匹配的错误解决了:很高兴你修复了它。当然,你应该从技术上检查属性的所有版本(每个参数集)非常感谢。我将尝试一下,看看我是否面临问题。我在测试TabControl时发现属性填充的模糊匹配错误(tabControl有两个TabPages)您知道为什么以及如何越过它吗?模糊匹配的错误已解决:很高兴您修复了它。当然,您应该从技术上检查属性的所有版本(每个参数集)