找到了模棱两可的比赛

时间:2012-10-23 14:10:41

标签: vb.net

我遇到了发现不明确匹配的问题 我想要做的是在GetType.GetProperties

中描述

用两个词来说,我试图遍历控件的所有属性,并查找用户是否对控件的属性进行了任何更改,然后我只获取更改的属性并存储这些属性的值

我遵循了这些建议,但是当控件是TabControl(tabControl有2个tabPages)时,我发现了padped Padding的错误。

2 个答案:

答案 0 :(得分:3)

在Ravindra Bagale的帮助下,我设法解决了这个问题: 问题不是新的修饰符,而是我的愚蠢: 在MSDN中说:

发生AmbiguousMatchException的情况包括:
 类型包含两个具有相同名称但参数数量不同的索引属性。要解决歧义,请使用指定参数类型的GetProperty方法的重载  派生类型通过使用new修饰符(Visual Basic中的Shadows)声明一个隐藏具有相同名称的继承属性的属性。要解决歧义,请使用GetProperty(String,BindingFlags)方法重载并包含BindingFlags.DeclaredOnly以将搜索限制为未继承的成员。

所以我使用了BindingFlags.DeclaredOnly并解决了问题:

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(BindingFlags.DeclaredOnly)
        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

答案 1 :(得分:0)

我要道歉 我之前的回答是错的。
使用BindingFlags.DeclaredOnly我没有得到我想要的属性。
所以我不得不用其他方式解决问题。

出现问题是因为两个属性具有相同的名称 所以我搜索了相同的命名属性不同的地方,我发现他们有:具有不同的 declaringType,MetadataToken PropertyType
所以我改变了我获得价值和解决问题的方式:

Dim val = cntrl.GetType().GetProperty(prop.Name, prop.PropertyType).GetValue(cntrl, Nothing)           
Dim defVal = newCnt.GetType().GetProperty(prop.Name,prop.PropertyType).GetValue(newCnt,Nothing)

对不起,如果我误导了某人。