Я хочу установить значения свойств с помощью отражения. В этом потоке они предложить решение. Но проблема с решением заключается в том, что оно не создает экземпляры свойств. Но я хочу проверить и создать экземпляр свойств, если это необходимо. Мой ДТО:
Public Class root
Public Property Printing() As rootPrinting
End Class
Public Class rootPrinting
Public Property Printer() As String
Public Property PrinterBatch() As String
End Class
Теперь для установки свойств я определил следующую функцию:
Public Sub SetProperty(ByVal target As Object, ByVal compoundProperty As String, ByVal value As Object)
Dim properties As String() = compoundProperty.Split("."c)
For i As Integer = 0 To properties.Length - 1 - 1
Dim propertyToGet As PropertyInfo = target.[GetType]().GetProperty(properties(i))
target = propertyToGet.GetValue(target, Nothing)
if IsNothing(target) then
if propertyToGet.PropertyType.IsClass then
target = Activator.CreateInstance(propertyToGet.PropertyType)
End If
End If
Next
Dim propertyToSet As PropertyInfo = target.[GetType]().GetProperty(properties.Last())
propertyToSet.SetValue(target, value, Nothing)
End Sub
Тогда я называю это так:
Dim configObject as New root
SetProperty(configObject , "Printing.Printer","skjfkd")
Если перед вызовом SetProperty(configObject,...)
я создам экземпляр configObject.Printing
, то он будет работать нормально:
Dim configObject as New root
configObject.Printing = new rootPrinting()
SetProperty(configObject , "Printing.Printer","skjfkd")
В противном случае после вызова SetProperty(...)
configObject.Printing
будет Nothing
.
Кажется, что при вызове Activator.CreateInstance(propertyToGet.PropertyType)
теряется ссылка на исходный объект. Пока объект в функции действительно инициализирован, основным объектом остается Nothing
. Как я могу правильно создать экземпляр свойства класса?