【发布时间】:2017-05-09 11:15:26
【问题描述】:
我正在用 VB 开发一个 ASP.NET MVC Web 应用程序,我需要将一组数据输出为表格格式,并允许用户配置可用集合中列的顺序和存在。数据集存储为表示行模型的对象类型列表。
目前,我使用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 是的,我认为它会起作用,但我不清楚与调用 CallByName 相比是否有性能优势。
标签: asp.net vb.net reflection system.reflection