2013-08-20 4 views
1

У меня есть класс, 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

Лучший способ сделать это, чтобы принять делегат, который возвращает свойство для каждого объекта в коллекции

Public Player sort(list As List(Of Player), func As Func(Of Player, Object)) 
    'sort the list by prop 
    Return sorted list 
End Function 

Затем вы можете использовать лямбда на месте вызова, чтобы указать свойство, которое вы хотите использовать

sort(list, Function(player) player.PID) 
+0

Это звучит хорошо, но я на самом деле не получить то, что вы имеете в виду, есть как имя имя для выполнения всего этого, так что я могу исследовать это? –

+2

@ user1091236, если вы хотите исследовать его, найдите термин «лямбда-выражения». вот хороший сайт, чтобы посмотреть http://msdn.microsoft.com/en-us/library/bb531253.aspx – JaredPar

+0

Спасибо, я посмотрю. Я только когда-либо видел лямбду как знак волны волны! –

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))

+0

А я посмотрел на этот метод, но это для проекта в колледже, и вам нужно показать, что вы действительно можете сделать сорт для себя. –

Смежные вопросы