Reflection Property   otázka

VB.NET

Už som sa dostal do štádia že si viem vytvoriť zoznam propert,ktoré mám vo svojej triede tu je kód

Imports System.Reflection

Public Class Class1

    Sub New()
        Dim a As Reflection.Assembly = Reflection.Assembly.LoadFrom("MenoPriezvisko.exe")
        
        Dim t As Type = a.GetType("MenoPriezvisko.Class1")
        Dim Vlastnosti() As System.Reflection.PropertyInfo = t.GetProperties()

        
    End Sub

    Dim _meno As String
    Public Property Meno() As String
        Get
            Return _meno
        End Get
        Set(ByVal value As String)
            _meno = value
        End Set
    End Property

    Dim _Priezvisko As String
    Public Property Priezvisko() As String
        Get
            Return _Priezvisko
        End Get
        Set(ByVal value As String)
            _Priezvisko = value
        End Set
    End Property

End Class

Ale neviem ako mám priradiť hodnotu do property Meno čo je vlastne Vlastnost(0) metódou SetValue mi vyhodí chybu

System.InvalidCastException was unhandled

Message="Objekt nelze uložit v poli tohoto typu."

A keď si dám Vlastnost(0) do Watch okna tak tam nevidím položku do ktorej sa dá zapísať Hodnota (možno tam aj je, ale neviem ktorá).

Ďakujem za pomoc.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

InvalidCastException znamená, že tam přiřazujete špatný datový typ. Pokud je to vlastnost typu Integer, musíte tam přiřadit Integer, pokud String, musíte přiřadit String. Nedělá to automaticky konverzi, jako když přiřazujete normálně.

Vyřešit se to dá tak, že hodnotu před přiřazením proženete funkcí

Convert.ChangeType(value, propertyInfo.PropertyType)

,

kde propertyInfo je příslušná instance property.

nahlásit spamnahlásit spam 3 / 3 odpovědětodpovědět

K vyššie uvedenému kódu som pridal nasledovný

' Property Meno
        Dim Vlastnosti2 As System.Reflection.PropertyInfo = t.GetProperty(Vlastnosti(0).Name)

       Dim index() As Object = {0}
        Dim Hodnota As Object = CObj(Convert.ChangeType("Karol", TypeCode.String))
        'Dim Hodnota As Object = CObj("Karol")
        'Dim Hodnota As String = "Karol"

Vlastnosti2.SetValue(Vlastnosti2, Hodnota, index)

znakom ' sú ozančené rôzne možnosti ktoré som skúšal, typ chyby bol vždy rovnaký

System.Reflection.TargetException was unhandled

Message="Objekt neodpovídá cílovému typu."

Ďakujem

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Vyhoďte to CObj a místo TypeCode.String dejte Vlastnosti2.PropertyType, ať to konvertujete přímo na typ té property.

A jste si jistý, že index má být 0. Opravdu ta vlastnost je indexer a index chce? Pokud nemá, dejte tam místo proměnné index hodnotu Nothing.

nahlásit spamnahlásit spam 2 / 2 odpovědětodpovědět

Jo a ještě v tom volání SetValue máte jako první parametr tu vlastnost, což je chyba - máte tam mít objekt, kterému tu vlastnost nastavujete.

nahlásit spamnahlásit spam 3 / 3 odpovědětodpovědět

Pozeral som aj na stránke MS

http://msdn.microsoft.com/en-us/library/...

bol tam uvedený nasledovný kód

Imports System.Reflection
Imports System.Collections.Generic

Class Example

    Private Shared _sharedProperty As Integer = 41
    Public Shared Property SharedProperty As Integer
        Get 
            Return _sharedProperty
        End Get
        Set
            _sharedProperty = Value
        End Set
    End Property

    Private _instanceProperty As Integer = 42
    Public Property InstanceProperty As Integer
        Get 
            Return _instanceProperty
        End Get
        Set
            _instanceProperty = Value
        End Set
    End Property

    Private _indexedInstanceProperty As New Dictionary(Of Integer, String)
    Default Public Property IndexedInstanceProperty(ByVal key As Integer) As String
        Get 
            Dim returnValue As String = Nothing
            If _indexedInstanceProperty.TryGetValue(key, returnValue) Then
                Return returnValue
            Else
                Return Nothing
            End If
        End Get
        Set
            If Value Is Nothing Then
                Throw New ApplicationException( _
                    "IndexedInstanceProperty value can be the empty string, but it cannot be Nothing.")
            Else
                If _indexedInstanceProperty.ContainsKey(key) Then
                    _indexedInstanceProperty(key) = Value
                Else
                    _indexedInstanceProperty.Add(key, Value)
                End If
            End If
        End Set
    End Property


    Shared Sub Main()

        Console.WriteLine("Initial value of class-level property: {0}", _
            Example.SharedProperty)

        Dim piShared As PropertyInfo = _
            GetType(Example).GetProperty("SharedProperty")
        piShared.SetValue( _
            Nothing, _
            76, _
            Nothing)

        Console.WriteLine("Final value of class-level property: {0}", _
            Example.SharedProperty)


        Dim exam As New Example

        Console.WriteLine(vbCrLf & _
            "Initial value of instance property: {0}", _
            exam.InstanceProperty)

        Dim piInstance As PropertyInfo = _
            GetType(Example).GetProperty("InstanceProperty")
        piInstance.SetValue( _
            exam, _
            37, _
            Nothing)

        Console.WriteLine("Final value of instance property: {0}", _
            exam.InstanceProperty)


        exam(17) = "String number 17"
        exam(46) = "String number 46"
        ' In Visual Basic, a default indexed property can also be referred
        ' to by name.
        exam.IndexedInstanceProperty(9) = "String number 9"

        Console.WriteLine(vbCrLf & _
            "Initial value of indexed instance property(17): '{0}'", _
            exam(17))

        Dim piIndexedInstance As PropertyInfo = _
            GetType(Example).GetProperty("IndexedInstanceProperty")
        piIndexedInstance.SetValue( _
            exam, _
            "New value for string number 17", _
            New Object() { CType(17, Integer) })

        Console.WriteLine("Final value of indexed instance property(17): '{0}'", _
            exam(17))

    End Sub
End Class

' This example produces the following output:
'
'Initial value of class-level property: 41
'Final value of class-level property: 76
'
'Initial value of instance property: 42
'Final value of instance property: 37
'
'Initial value of indexed instance property(17): 'String number 17'
'Final value of indexed instance property(17): 'New value for string number 17'

Prvé dve použitia SetValue som pochopil, ale to tretie s použitím Directory som nepochopil. (vyzerá to tak že sa do Directory dávajú inštancie Exam, a potom sa pomocou indexu vyberajú)

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback