Vb.net 使用反射设置值

Vb.net 使用反射设置值,vb.net,reflection,system.reflection,Vb.net,Reflection,System.reflection,我正在使用VB.NET。我创建了一个小规模的测试项目,其工作原理与我的程序类似。我想说的是:getObjectType(object1),如果object1.getType()=“ThisType”,那么获取属性。每个对象都包含一个ID,我想这样做:Object1.ID=-1(我知道它不会那么短或简单)。我认为有一种方法可以做到这一点,比如:Object1.SetValue(Value2Change,NewValue),但这不起作用,我不知道如何确切地做到这一点。下面是我的代码。谢谢大家! Mo

我正在使用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

我很难理解你的代码示例是如何应用于你的问题的,但是如果你只是问如何使用反射设置对象的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

我很难理解你的代码示例是如何应用于你的问题的,但是如果你只是问如何使用反射设置对象的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
可以使用来设置使用反射的值。您还可以使用LINQ查询简化查找正确的
属性info
,因此您可以执行以下操作:

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

您可以使用反射来设置值。您还可以使用LINQ查询简化查找正确的
属性info
,因此您可以执行以下操作:

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属性,或者仅仅是类型检查和强制转换等会更好。

非常有效。谢谢这是我发现的唯一一种不用创建一个广泛的类来计算属性和其他属性的方法。谢谢这是我发现的唯一一种不用创建一个扩展类来计算属性的方法。