代码之家  ›  专栏  ›  技术社区  ›  MattCucco

使用反射设置值

  •  1
  • MattCucco  · 技术社区  · 8 年前

    我正在使用VB.NET。我创建了一个小规模的测试项目,其工作原理与我的程序类似。我想说的是:getObjectType(object1),如果object1.getType()=“ThisType”,则获取属性。每个对象都包含一个ID,我想这样做:Object1.ID=-1(我知道它不会那么短或容易)。我认为有一种方法可以通过使用Object1.SetValue(Value2Change,NewValue)这样的东西来实现这一点,但这不起作用,我不知道该怎么做。下面是我的代码。非常感谢。

    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
    
    2 回复  |  直到 8 年前
        1
  •  2
  •   Mark    8 年前

    你可以使用 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属性,或者只进行类型检查和强制转换等会更好。

        2
  •  1
  •   Bert Cushman    8 年前

    好吧,我很难理解您的代码示例如何应用于您的问题,但如果您只是问如何使用反射设置对象的ID,那么这段代码可能会对您有所帮助。技巧是,属性通常使用set和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