Newsgroup: it.comp.lang.visual-basic
Titolo: [?] [.NET] Reflection - PropertyInfo

Ciao a tutti,
Una domandina su System.Reflection.
Con MethodInfo io posso sapere ad esempio che un dato metodo è pubblico o
privato.
Però PropertyInfo non espone IsPublic o IsPrivate.
Come si fa a ottenere queste informazioni per una proprietà?
Grazie.
--
Math Parser : 
http://www.neodatatype.net

 Come si fa a ottenere queste informazioni per una proprietà?
Ci dovresti arrivare passando da
PropertyInfo.PropertyType.IsPublic/IsPrivate
Il fatto e' che, a quanto pare, nell'insieme restituito da
Type.GetProperties non sono incluse le property private... i campi, pubblici
e privati, li trovi con Type.GetFields, ma una routine dichiarata come
Private ReadOnly Property Test() As String
    Get
        Test = "test"
    End Get
End Property
in effetti non sono riuscito piu' a "beccarla"
Ciao
-- 
Luca Dormio - 
luca....@tin.it
________________________________
"Marty, non stai ragionando in maniera quadridimensionale"
Dr. Emmett L. Brown

 in effetti non sono riuscito piu' a "beccarla"
Cioè le prop. private vengono già filtrate?
Ciao
--
Math Parser, VB.Framework : 
http://www.neodatatype.net
Sito Comune               : 
http://www.it-lang-vb.net

 Cioè le prop. private vengono già filtrate?
Parrebbe di si... io non sono riuscito piu' a trovarla ne' nell'insieme
Properties e nemmeno in quelli Fields e Members
A dire il vero ho verificato che anche in Fields, pur avendo FieldInfo le
property IsPublic/IsPrivate, sono inclusi solo quelli pubblici
Il disassembler pero' li vede eccome nei metadati, per cui probabilmente
c'e' modo di arrivarci...


Forse si puo' fare di meglio, pero' perlomeno funziona...
Dim oAss As [Assembly] = [Assembly].GetExecutingAssembly
Dim oType As Type = oAss.GetType("Test1.MyOwnClass")
Dim mi() As PropertyInfo = oType.GetProperties(BindingFlags.Public Or
BindingFlags.Instance Or BindingFlags.NonPublic)
For Each pi As PropertyInfo In mi
 Dim infos As MethodInfo() = pi.GetAccessors(False)
 Dim IsPublic As Boolean = infos.Length > 0
 Console.WriteLine("Property {0} is {1:Public;;Private}", pi.Name, -1 *
IsPublic)
Next
Public Class MyOwnClass
            Public Sub Test()
            End Sub
            Private Property Name() As String
                        Get
                        End Get
                        Set(ByVal Value As String)
                        End Set
            End Property
            Public Property Age() As Int32
                        Get
                        End Get
                        Set(ByVal Value As Int32)
                        End Set
            End Property
End Class
HTH
-- 
Corrado Cavalli [Microsoft .NET MVP-MCP]
UGIdotNET - 
http://www.ugidotnet.org

 Next
Mi è stata suggerita anche questa soluzione.
Non l'ho ancora provata.
Ciao
----
 Public Shared Function GetPropertyVisiblity(ByVal pi As PropertyInfo) As
Integer
        Dim mSetMethod As MethodInfo
        Dim mGetMethod As MethodInfo
        Dim mCheck As MethodInfo
        'If the property is not write-only, get its "Get" method
        If pi.CanRead Then mGetMethod = pi.GetGetMethod(True)
        'If the property is not read-only, get its "Set" method
        If pi.CanWrite Then mSetMethod = pi.GetSetMethod(True)
        'If there is no "set" method, use the "get" method, and vice versa
        If mSetMethod Is Nothing Then
            mCheck = mGetMethod
        ElseIf mGetMethod Is Nothing Then
            mCheck = mSetMethod
        Else
            mCheck = mSetMethod
        End If
        'Get the attributes of the method
        Dim mAttr As MethodAttributes = mCheck.Attributes And
MethodAttributes.MemberAccessMask
        'Check its visibility
        If (mAttr And MethodAttributes.Public) = MethodAttributes.Public
Then
            Return 1 'public
        ElseIf (mAttr And MethodAttributes.Family) = MethodAttributes.Family
Then
            Return 2 'protected
        ElseIf (mAttr And MethodAttributes.Assembly) =
MethodAttributes.Assembly Then
            Return 3 'internal
        ElseIf (mAttr And MethodAttributes.Private) =
MethodAttributes.Private Then
            Return 4 'private
        End If
End Function
---
-- Math Parser : 
http://www.neodatatype.netSito
 Comune :
http://www.it-lang-vb.net