1

定義のように、 aFunctionまたは aSubを使用AddressOfしてaを渡すことができることを知っています。DelegateThreadStart

Dim oThStart as new System.Threading.Thread.ThreadStart(AddressOf MySub)

これで、同じオブジェクトの異なるプロパティに対して同じ処理を何度も行うこのプログラムができました。これは私が持っているコードの一部です。2 回しか示していませんが、全部で 9 回あり、まだ含めていない他の処理があるため、さらに大きくなります。

If _oInfoRefBase.InfoStr1Column = "" Then
    _oInfoRefBase.InfoStr1Column = oColumn.ColumnName
    GetHeader(ColInfoStr1, _oInfoTable.NomTable, oColumn.ColumnName)
    _oInfoRefBase.InfoStr1Numeric = boolIsNumeric
    _oInfoRefBase.InfoStr1Float = boolIsFloat
    _oInfoRefBase.InfoDefaultStr1 = GetDefault(ColInfoStr1, _oInfoTable.NomTable, oColumn.ColumnName)

ElseIf _oInfoRefBase.InfoStr2Column = "" Then
    _oInfoRefBase.InfoStr2Column = oColumn.ColumnName
    GetHeader(ColInfoStr2, _oInfoTable.NomTable, oColumn.ColumnName)
    _oInfoRefBase.InfoStr2Numeric = boolIsNumeric
    _oInfoRefBase.InfoStr2Float = boolIsFloat
    _oInfoRefBase.InfoDefaultStr2 = GetDefault(ColInfoStr2, _oInfoTable.NomTable, oColumn.ColumnName)
End If

GetOtherInfo()私がしたいのは、反復に依存する必要なプロパティを満たすために呼び出すことができる新しい関数を定義することです。何かのようなもの

GetOtherInfo(_oInfoRefBase.InfoStr1Numeric,_oInfoRefBase.InfoStr1Float,_oInfoRefBase.InfoStr1NotNull,boolIsNumeric,boolIsFloat,ColInfoStr1,_oInfoTable.NomTable, oColumn.ColumnName)

また

GetOtherInfo(_oInfoRefBase.InfoStr2Numeric,_oInfoRefBase.InfoStr2Float,_oInfoRefBase.InfoStr2NotNull,boolIsNumeric,boolIsFloat,ColInfoStr2,_oInfoTable.NomTable, oColumn.ColumnName)

等々。プロパティの値を送信するので、この構文が適切ではないことはわかっていますが、変更できるように送信したいと思います。それが違いを生む場合、いくつかのプロパティはセット内の検証です。

出来ますか?もしそうなら、どのように?

4

1 に答える 1

1

はい、可能です。プロパティを取得/設定するには、GetValue メソッドと SetValue メソッドを持つ System.Reflection.PropertyInfo を使用することをお勧めします。また、生活を楽にするために、プロパティ情報を簡単に取得するための手順をまとめることもできます。

疑似コード

Function GetPropertyInfo(Of T As Class)(obj As T, propertyFunc As Func(Of T, Object)) As System.Reflection.PropertyInfo
    ' implement using reflection or expression trees
End Function

' Sample usage:

Sub Test()
    ' Copy value from obj1.Name to obj2.Description
    Dim obj1 = New ClassA()
    Dim source = GetPropertyInfo(obj1, Function(t As ClassA) t.Name)

    Dim obj2 = New ClassB()
    Dim target = GetPropertyInfo(obj2, Function(t As ClassB) t.Description)

    target.SetValue(obj2, source.GetValue)
End Sub

反射には注意してください。パフォーマンスはそれほど良くありません。したがって、これを回避するには、いくつかの式ツリーを使用して高速なプロパティ ラッパーを作成してみてください。ネット上にはそのためのリソースがたくさんあると思います。

例えば ​​- http://geekswithblogs.net/Madman/archive/2008/06/27/faster-reflection-using-expression-trees.aspx

于 2013-07-26T04:09:45.197 に答える