2016-06-20 9 views
0

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 

답변

1

반사식을 사용하여 PropertyInfo.SetValue을 사용하여 값을 설정할 수 있습니다. 또한 올바른 PropertyInfo 찾는 단순화하기 위해 LINQ SingleOrDefault 쿼리를 사용할 수 있습니다, 그래서 당신은 같은 것을 할 수있는 당신이 정말로 반사 사용해야 할 경우 질문에서 명확하지

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

글쎄, 난 당신의 코드 예제는 질문에 적용하는 방법을 참조하기 위해 노력하지만, 당신은 단순히 반사를 사용하여 개체의 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 
관련 문제