我遇到了发现歧义匹配的问题我正在尝试做的事情描述在:GetType.GetProperties
简而言之,我试图遍历控件的所有属性并查找用户是否对控件的属性进行了任何更改,然后我只获取更改的属性并存储这些属性的值
我遵循了这些建议,但是当控件是 TabControl(tabControl 有 2 个 tabPages)时,我得到了一个错误的属性填充。
我遇到了发现歧义匹配的问题我正在尝试做的事情描述在:GetType.GetProperties
简而言之,我试图遍历控件的所有属性并查找用户是否对控件的属性进行了任何更改,然后我只获取更改的属性并存储这些属性的值
我遵循了这些建议,但是当控件是 TabControl(tabControl 有 2 个 tabPages)时,我得到了一个错误的属性填充。
好的,在 Ravindra Bagale 的帮助下,我设法解决了它:问题不是新的修饰符,而是我的愚蠢:在MSDN中说:
发生 AmbiguousMatchException 的情况包括:
一个类型包含两个具有相同名称但参数数量不同的索引属性。若要解决歧义,请使用指定参数类型的 GetProperty 方法的重载。
派生类型通过使用 new 修饰符(Visual Basic 中的阴影)声明一个隐藏同名继承属性的属性。若要解决歧义,请使用 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
结束子
我必须道歉。
我之前的回答是错误的。
使用 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)
对不起,如果我误导了某人。