我正在VB中開發一個ASP.NET MVC Web應用程序,我需要輸出一組數據到表格式,並允許用戶配置從可用集合中訂購和存在列。數據集存儲爲表示行模型的對象類型的列表。基於名稱作爲字符串訪問VB屬性 - 最快的選項
目前,我使用CallByName執行此操作。迭代屬性名稱的有序列表並從行模型的實例中輸出值。然而,根據測試,這似乎是這個過程中的一個主要瓶頸。
我見過一個建議,存儲委託來獲取屬性,反對該屬性的名稱的字符串表示形式。所以,我大概可以做這樣的事情:
Public Delegate Function GetColumn(ByRef RowObj As RowModel) As String
Dim GetPropOne As GetColumn = Function(ByRef RowObj As RowModel) RowObj.Prop1.ToString()
Dim accessors As New Hashtable()
accessors.Add("Prop1", GetPropOne)
然後,通過循環而做這樣的事情:
Dim acc As GetColumn = accessors(ColumnName)
Dim val As String = acc.Invoke(currentRow)
它看起來更快,但它也像更多的維護。如果這確實更快,有沒有辦法我可以動態地構建這樣的東西?我在想:
Public Delegate Function GetObjectProperty(Instance As Object) As Object
For Each prop In GetType(RowModel).GetProperties()
Dim acc As GetObjectProperty = AddressOf prop.GetValue
columns.Add(prop.Name, acc)
Next
Dim getColVal As GetObjectProperty = columns(ColumnName)
Dim val As String = getColVal.Invoke(currentRow).ToString()
對於不同方法的建議可以使用。
@VisualVincent是的,我認爲它會工作,但我對是否有性能優勢VS調用CallByName不清楚。 –