2016-06-20 9 views
0

Ich benutze VB.NET. Ich habe ein kleines Testprojekt erstellt, das ähnlich wie mein Programm funktioniert. Ich versuche etwas zu sagen: getObjectType (object1) wenn Object1.getType() = "ThisType" dann die Eigenschaften erhalten. Jedes Objekt enthält eine ID und ich möchte dies tun: Object1.Id = -1 (Ich weiß, dass es nicht so kurz oder einfach sein wird). Ich dachte, es gibt eine Möglichkeit, dies zu tun, indem man etwas wie: Object1.SetValue (Value2Change, NewValue) verwendet, aber das funktioniert nicht und ich bin mir nicht sicher, wie ich das genau machen soll. Unten ist mein Code. Danke!Setzen von Werten mit 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 

Antwort

1

Sie können PropertyInfo.SetValue verwenden, um den Wert mithilfe der Reflektion festzulegen. Sie können auch eine LINQ SingleOrDefault Abfrage zu vereinfachen verwenden die richtige PropertyInfo zu finden, so könnte man so etwas tun:

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 

Aus der Frage nicht klar ist, wenn Sie wirklich Reflexion verwenden müssen - vielleicht eine gemeinsame Schnittstelle zu definieren, die Id-Eigenschaft, oder einfach nur Typ-Checking und Casting usw. wäre besser.

+0

Arbeitete wie ein Charme. Vielen Dank! Und es ist der einzige Weg, den ich gefunden habe, ich kann dies tun, ohne eine umfangreiche Klasse zu erstellen, um die Eigenschaften herauszufinden und was nicht. – MattCucco

1

Nun, kämpfte ich, um zu sehen, wie Ihr Code Beispiel auf Ihre Frage angewendet, aber wenn man einfach fragen, wie die ID eines Objekts einzustellen Reflexion verwendet wird, dieser Code könnte Ihnen helfen. Der Trick besteht darin, dass eine Eigenschaft normalerweise mit einer set- und einer get-Methode behandelt wird.

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