我有一个类,Player,它有6个左右的属性,都是整数。对于我的项目,需要进行一些排序,我希望能够编写一个接受玩家列表的属性和一个属性来对它们进行排序,返回按传递属性排序的玩家列表:
Class Player
Public Property PID
Public Property RunsScored
PublicProperty BallsFaced
End Class
Class AnotherClass
Public Shared PlayerList As New List(Of Player)
Public Player sort(list As List(Of Player), prop As Property)
'sort the list by prop
Return sorted list
End Function
但我不知道这是否是一个东西,它有名字吗?它甚至可能吗?
答案 0 :(得分:2)
执行此操作的最佳方法是获取一个委托,该委托为集合中的每个对象返回一个属性
Public Player sort(list As List(Of Player), func As Func(Of Player, Object))
'sort the list by prop
Return sorted list
End Function
然后,您可以在呼叫站点使用lambda来指定要使用的属性
sort(list, Function(player) player.PID)
答案 1 :(得分:0)
您可以使用Reflection in the .NET Framework完成任务。
首先是排序功能(包含如何获取值的示例,排序是您的业务)。
Public Sub SortPlayer(list As List(Of Player), prop As Reflection.PropertyInfo)
...
Dim value = prop.GetValue(list(1), Nothing)
...
End Sub
现在该怎么称呼它:
Public Sub CallSort()
Dim MyList As New Generic.List(Of Player)
...
SortPlayer(MyList, GetType(Player).GetProperty("RunsScored"))
End Sub
问题是,字符串名称属性可能会在运行时导致问题。所以功能是必要的。
Public Sub CallSort2()
Dim MyList As New Generic.List(Of Player)
SortPlayer(MyList, GetType(Player).GetProperty(GetPropertyName(Function() MyList(0).PID)))
End Sub
可以找到 GetPropertyName
实施例如在NotifyOfPropertyChange(() => Name)
注意强>
JaredPar解决方案可能更好,但这是对这个问题的回答。