2016-06-20 7 views
0

私はVB.NETを使用しています。私は自分のプログラムと同じように動作する小規模のテストプロジェクトを作成しました。私は、Object1.getType()= "ThisType"の場合はgetObjectType(object1)、次にプロパティを取得します。各オブジェクトにはIDが含まれており、これを実行したいと思います:Object1.Id = -1(これは短くて簡単ではないことがわかります)。私はObject1.SetValue(Value2Change、NewValue)のようなものを使ってこれを行う方法があると思ったが、それはうまくいかず、正確にこれを行う方法がわからない。以下は私のコードです。ありがとうございました!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 

答えて

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 
関連する問題