如何将属性作为参数传递

时间:2013-08-20 22:27:21

标签: vb.net properties parameters

我有一个类,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

但我不知道这是否是一个东西,它有名字吗?它甚至可能吗?

2 个答案:

答案 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解决方案可能更好,但这是对这个问题的回答。

我建议你注意List(Of T).Sort Method (Comparison(Of T))