将属性作为参数传递,如VB.net中的委托

时间:2013-07-25 12:35:10

标签: vb.net properties

我知道可以使用Function传递SubAddressOf来传递Delegate,就像ThreadStart定义一样。

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

现在我有了这个程序,我一遍又一遍地进行相同的处理,但是在同一个对象的不同属性上。这是我的代码的一部分。我只展示了两次迭代,但总共有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)

OR

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

等等。我知道这个语法不正确,因为我发送了我的属性的值,但我想发送它以便我可以更改它。如果产生差异,则某些属性会在集合中进行验证。

有可能吗?如果是这样的话?

1 个答案:

答案 0 :(得分:1)

是的,这是可能的。您可能希望使用具有GetValue和SetValue方法的System.Reflection.PropertyInfo来获取/设置一个proeprty。而且,为了让生活更轻松,您可能还需要完成一些程序以轻松获取属性信息。

伪代码

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