1

我知道可以传递 aFunction或 a SubusingAddressOf来传递 a Delegate,就像在ThreadStart定义中一样。

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

现在我有了这个程序,我在其中一遍又一遍地做同样的处理,但是对同一个对象的不同属性。这是我拥有的代码的一部分。我只展示了两次迭代,但总共有九次,还有其他处理我还没有包括在内,所以它会变得更大。

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 回答