Vb.net 反射:如果属性具有非公共(私有/受保护)Setter,如何从属性信息对象中查找?

Vb.net 反射:如果属性具有非公共(私有/受保护)Setter,如何从属性信息对象中查找?,vb.net,reflection,private,setter,Vb.net,Reflection,Private,Setter,我在论坛/互联网上搜索了propertyinfo对象(公共属性)如何显示其是否有私有\受保护的Setter的解决方案。。。这一切都是徒劳的。。。。我找到的所有帮助都是关于如何“设置”拥有私有Setter的公共财产的值 我想知道如果我有一个公共属性的PropertyInfo对象,我如何知道它的Setter是否为非公共 我在一个异常处理块中尝试了,在该块中,我对PropertyInfo对象执行了一个GetValue,然后通过设置相同的值来调用SetValue。。。但令我惊讶的是,它运行良好,没有出错

我在论坛/互联网上搜索了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。问得好,回答得好。谢谢大家!