2016-06-20 2 views
0

J'utilise VB.NET. J'ai créé un projet de test à petite échelle qui fonctionne de manière similaire à mon programme. J'essaye de dire quelque chose comme: getObjectType (object1) si Object1.getType() = "ThisType" obtient alors les propriétés. Chaque objet contient un identifiant et je voudrais faire ceci: Object1.Id = -1 (je sais que ce ne sera pas aussi court ou facile). Je pensais qu'il y avait un moyen de le faire en utilisant quelque chose comme: Object1.SetValue (Value2Change, NewValue) mais cela ne fonctionne pas et je ne suis pas sûr de savoir comment faire exactement cela. Voici mon code. Je vous remercie!Définition de valeurs à l'aide de la réflexion

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 

Répondre

1

Vous pouvez utiliser PropertyInfo.SetValue pour définir la valeur à l'aide de la réflexion. Vous pouvez également utiliser un LINQ SingleOrDefault requête pour simplifier la recherche PropertyInfo correcte, vous pouvez donc faire quelque chose comme ceci:

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 

On ne sait pas de la question si vous avez vraiment besoin d'utiliser la réflexion - peut-être une interface commune pour définir la propriété id, ou simplement la vérification de type et le casting, etc. serait mieux.

+0

A travaillé comme un charme. Merci! Et c'est la seule façon que j'ai trouvé que je peux le faire sans créer une classe étendue pour comprendre les propriétés et quoi d'autre. – MattCucco

1

Eh bien, je luttais pour voir comment votre exemple de code appliqué à votre question, mais si vous demandez simplement comment configurer l'ID d'un objet en utilisant la réflexion, ce code peut vous aider. L'astuce est qu'une propriété est généralement gérée à l'aide d'un ensemble et d'une méthode 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