2016-06-20 5 views
0

Я использую VB.NET. Я создал небольшой тестовый проект, который работает аналогично моей программе. Я пытаюсь сказать что-то вроде: getObjectType (object1), если Object1.getType() = "ThisType", затем получить свойства. Каждый объект содержит идентификатор, и я хотел бы сделать это: Object1.Id = -1 (я знаю, что это будет не так просто или просто). Я думал, что есть способ сделать это, используя что-то вроде: Object1.SetValue (Value2Change, NewValue), но это не работает, и я не уверен, как это сделать. Ниже мой код. Спасибо!Установка значений с использованием Reflection

Module Module1 

Sub Main() 

    Dim Db As New Luk_StackUp_ProgramEntities 

    Dim Obj1 As IEnumerable(Of Stackup) = (From a In Db.Stackups).ToList 
    Dim Obj2 As IEnumerable(Of Object) = (From a In Db.Stackups).ToList 

    Dim IdNow As Integer = Obj1(0).IdStackup 
    Dim StackUpNow As Stackup = (From a In Db.Stackups Where a.IdStackup = IdNow).Single 
    Console.WriteLine(StackUpNow) 

    getInfo(StackUpNow) 
    getInfo(Obj1(0), Obj1(0)) 
    areObjectsSame(Obj1(0), Obj1(67)) 
    switchObjects(Obj1(0), Obj2(1)) 
    getObjectValues(Obj2(55)) 


    Console.WriteLine("========================================") 
    TestCopyObject(StackUpNow) 
    ChangeObjectValues(StackUpNow) 

    Console.ReadKey() 
End Sub 

Private Sub ChangeObjectValues(Object1 As Object) 

    Console.WriteLine("Changing Object Values") 
    Dim myField As PropertyInfo() = Object1.GetType().GetProperties() 
    'Dim Index As Integer 'Did not find value 
    'For Index = 0 To myField.Length - 1 
    ' If myField(Index).ToString.Trim = "IdStackup" Then 
    '  Console.WriteLine("Found the ID") 
    ' End If 
    'Next 
    If Object1.GetType().Name = "Stackup" Then 
     'Set the Value 
    End If 

End Sub 

ответ

1

Вы можете использовать PropertyInfo.SetValue, чтобы установить значение с помощью отражения. Кроме того, можно использовать запрос LINQ SingleOrDefault для облегчения поиска правильного PropertyInfo, так что вы могли бы сделать что-то вроде этого:

Private Sub ChangeObjectValues(Object1 As Object) 

    Console.WriteLine("Changing Object Values") 

    Dim t As Type = Object1.GetType() 
    If t.Name = "Stackup" Then 
     Dim myField As PropertyInfo = t.GetProperties() _ 
      .SingleOrDefault(Function(x) x.Name = "IdStackup") 
     If myField IsNot Nothing Then 
      Console.WriteLine("Found the ID") 
      myField.SetValue(Object1, -1) 
     End If 
    End If 

End Sub 

это не ясно из вопроса, если вам действительно нужно использовать отражение - возможно, общий интерфейс для определения свойство id, или просто проверка типов и литье и т. д. было бы лучше.

+0

Работал как очарование. Благодаря! И это единственный способ, который я нашел, я могу сделать это, не создавая обширный класс, чтобы выяснить свойства, а что нет. – MattCucco

1

Ну, я изо всех сил, чтобы увидеть, как ваш пример кода применяется на ваш вопрос, но если вы просто спрашиваете, как установить идентификатор объекта с помощью отражения, этот код может помочь вам. Фокус в том, что свойство обычно обрабатывается с помощью набора и метода get.

Imports System.Web.UI.WebControls 
Imports System.Reflection 

Module Module1 

Sub Main() 
    Dim tb As New Label() 

    Dim t As Type = tb.GetType() 
    If TypeOf tb Is Label Then 
     Dim mi As MethodInfo = t.GetMethod("set_ID") 
     mi.Invoke(tb, New Object() {"-1"}) 
    End If 

    Console.WriteLine(tb.ID) 
    Console.ReadLine() 
End Sub 

End Module