Vb.net 反射:如果属性具有非公共(私有/受保护)Setter,如何从属性信息对象中查找?
我在论坛/互联网上搜索了propertyinfo对象(公共属性)如何显示其是否有私有\受保护的Setter的解决方案。。。这一切都是徒劳的。。。。我找到的所有帮助都是关于如何“设置”拥有私有Setter的公共财产的值 我想知道如果我有一个公共属性的PropertyInfo对象,我如何知道它的Setter是否为非公共 我在一个异常处理块中尝试了,在该块中,我对PropertyInfo对象执行了一个GetValue,然后通过设置相同的值来调用SetValue。。。但令我惊讶的是,它运行良好,没有出错 我会非常感激你的帮助 例如 末级Vb.net 反射:如果属性具有非公共(私有/受保护)Setter,如何从属性信息对象中查找?,vb.net,reflection,private,setter,Vb.net,Reflection,Private,Setter,我在论坛/互联网上搜索了propertyinfo对象(公共属性)如何显示其是否有私有\受保护的Setter的解决方案。。。这一切都是徒劳的。。。。我找到的所有帮助都是关于如何“设置”拥有私有Setter的公共财产的值 我想知道如果我有一个公共属性的PropertyInfo对象,我如何知道它的Setter是否为非公共 我在一个异常处理块中尝试了,在该块中,我对PropertyInfo对象执行了一个GetValue,然后通过设置相同的值来调用SetValue。。。但令我惊讶的是,它运行良好,没有出错
Dim [property] As ExPropertyInfo = New ExPropertyInfo(GetType(Form1).GetProperty("abc", BindingFlags.NonPublic Or BindingFlags.Static))
Thx
Vinit sankhe。一旦拥有属性的,就可以调用其函数来返回set访问器的。然后,您可以检查MethodInfo
的属性,查看set访问器是否为public
Dim prInfo As PropertyInfo = Me.GetType.GetProperty(propName)
Dim method as MethodInfo = prInfo.GetSetMethod()
If Not method.IsPublic Then
Return False
Else
Dim value As Object = prInfo.GetValue(ownObj, Nothing)
prInfo.SetValue(ownObj, value, Nothing) 'Works for Private Setter
End If
事实上,然后你们两个都采取了设置和获取方法的立场,下面是一个示例:
Public Class ExPropertyInfo
Inherits PropertyInfo
Dim p As PropertyInfo
Public Sub New(ByVal [property] As PropertyInfo)
p = [property]
Dim accssors() As MethodInfo = [property].GetAccessors(True)
Select Case accssors.Length
Case 1
isassembly_ = accssors(0).IsAssembly
isfamily_ = accssors(0).IsFamily
isprivate_ = accssors(0).IsPrivate
ispublic_ = accssors(0).IsPublic
isstatic_ = accssors(0).IsStatic
isfamilyandassembly_ = accssors(0).IsFamilyAndAssembly
isfamilyorassembly_ = accssors(0).IsFamilyOrAssembly
Case 2
Dim method As MethodInfo = Nothing
If accssors(0).IsPrivate Then
If accssors(1).IsFamily Or accssors(1).IsFamilyAndAssembly Or accssors(1).IsFamilyOrAssembly Or accssors(1).IsAssembly Or accssors(1).IsPublic Then
method = accssors(1)
Else
method = accssors(0)
End If
ElseIf accssors(0).IsFamily Then
If accssors(1).IsFamilyAndAssembly Or accssors(1).IsFamilyOrAssembly Or accssors(1).IsAssembly Or accssors(1).IsPublic Then
method = accssors(1)
Else
method = accssors(0)
End If
ElseIf accssors(0).IsFamilyAndAssembly Or accssors(0).IsFamilyOrAssembly Then
If accssors(1).IsAssembly Or accssors(1).IsPublic Then
method = accssors(1)
Else
method = accssors(0)
End If
ElseIf accssors(0).IsAssembly Or accssors(0).IsPublic Then
If accssors(1).IsPublic Then
method = accssors(1)
Else
method = accssors(0)
End If
End If
isassembly_ = method.IsAssembly
isfamily_ = method.IsFamily
isprivate_ = method.IsPrivate
ispublic_ = method.IsPublic
isstatic_ = method.IsStatic
isfamilyandassembly_ = method.IsFamilyAndAssembly
isfamilyorassembly_ = method.IsFamilyOrAssembly
End Select
End Sub
Public Overrides ReadOnly Property Attributes As Reflection.PropertyAttributes
Get
Return p.Attributes
End Get
End Property
Public Overrides ReadOnly Property CanRead As Boolean
Get
Return p.CanRead
End Get
End Property
Public Overrides ReadOnly Property CanWrite As Boolean
Get
Return p.CanWrite
End Get
End Property
Public Overrides ReadOnly Property DeclaringType As Type
Get
Return p.DeclaringType
End Get
End Property
Public Overloads Overrides Function GetAccessors(nonPublic As Boolean) As MethodInfo()
Return p.GetAccessors(nonPublic)
End Function
Public Overloads Overrides Function GetCustomAttributes(inherit As Boolean) As Object()
Return p.GetCustomAttributes(inherit)
End Function
Public Overloads Overrides Function GetCustomAttributes(attributeType As Type, inherit As Boolean) As Object()
Return p.GetCustomAttributes(attributeType, inherit)
End Function
Public Overloads Overrides Function GetGetMethod(nonPublic As Boolean) As MethodInfo
Return p.GetGetMethod(nonPublic)
End Function
Public Overrides Function GetIndexParameters() As ParameterInfo()
Return p.GetIndexParameters
End Function
Public Overloads Overrides Function GetSetMethod(nonPublic As Boolean) As MethodInfo
Return p.GetSetMethod(nonPublic)
End Function
Public Overloads Overrides Function GetValue(obj As Object, invokeAttr As BindingFlags, binder As Binder, index() As Object, culture As Globalization.CultureInfo) As Object
Return p.GetValue(obj, invokeAttr, binder, index, culture)
End Function
Public Overrides Function IsDefined(attributeType As Type, inherit As Boolean) As Boolean
Return p.IsDefined(attributeType, inherit)
End Function
Public Overrides ReadOnly Property Name As String
Get
Return p.Name
End Get
End Property
Public Overrides ReadOnly Property PropertyType As Type
Get
Return p.PropertyType
End Get
End Property
Public Overrides ReadOnly Property ReflectedType As Type
Get
Return p.ReflectedType
End Get
End Property
Public Overloads Overrides Sub SetValue(obj As Object, value As Object, invokeAttr As BindingFlags, binder As Binder, index() As Object, culture As Globalization.CultureInfo)
p.SetValue(obj, value, invokeAttr, binder, index, culture)
End Sub
Private ispublic_ As Boolean
Public ReadOnly Property IsPublic As Boolean
Get
Return ispublic_
End Get
End Property
Private isprivate_ As Boolean
Public ReadOnly Property IsPrivate As Boolean
Get
Return isprivate_
End Get
End Property
Private isassembly_ As Boolean
Public ReadOnly Property IsAssembly As Boolean
Get
Return isassembly_
End Get
End Property
Private isfamily_ As Boolean
Public ReadOnly Property IsFamily As Boolean
Get
Return isfamily_
End Get
End Property
Private isstatic_ As Boolean
Public ReadOnly Property IsStatic As Boolean
Get
Return isstatic_
End Get
End Property
Private isfamilyandassembly_ As Boolean
Public ReadOnly Property IsFamilyAndAssembly As Boolean
Get
Return isfamilyandassembly_
End Get
End Property
Private isfamilyorassembly_ As Boolean
Public ReadOnly Property IsFamilyOrAssembly As Boolean
Get
Return isfamilyorassembly_
End Get
End Property
末级
Dim [property] As ExPropertyInfo = New ExPropertyInfo(GetType(Form1).GetProperty("abc", BindingFlags.NonPublic Or BindingFlags.Static))
PropertyInfo.GetAccessors方法返回get和set方法的数组。请在标记中指定编程语言:)非常有用,尽管MSDN()说它只会返回MethodInfo“如果set accessor存在并且是公共的”。在这种情况下,我们可能希望使用重载(),该重载接受一个bool,指示是否检索非公共setter。我可以验证GetSetMethod()仅在访问器存在且在.NET 3.5中是公共的情况下返回MethodInfo。问得好,回答得好。谢谢大家!