我知道可以使用Function
传递Sub
或AddressOf
来传递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)
等等。我知道这个语法不正确,因为我发送了我的属性的值,但我想发送它以便我可以更改它。如果产生差异,则某些属性会在集合中进行验证。
有可能吗?如果是这样的话?
答案 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