01.
Imports
System.Collections.Generic
02.
Imports
System.Linq
03.
Imports
System.Reflection
04.
Imports
System.Linq.Expressions
05.
06.
Public
Module
IEnumerableHelper
07.
Sub
New
()
08.
End
Sub
09.
10.
Private
orderBy_
As
MethodInfo =
GetType
(Enumerable).GetMethods(BindingFlags.[
Static
]
Or
BindingFlags.[
Public
]) _
11.
.Where(
Function
(x) x.Name =
"OrderBy"
AndAlso
x.GetParameters().Length = 2).First()
12.
13.
<System.Runtime.CompilerServices.Extension()> _
14.
Public
Function
OrderBy(Of TSource)(source
As
IEnumerable(Of TSource), propertyName
As
String
)
As
IEnumerable(Of TSource)
15.
Dim
pi =
GetType
(TSource).GetProperty(propertyName, BindingFlags.[
Public
]
Or
BindingFlags.FlattenHierarchy
Or
BindingFlags.Instance)
16.
Dim
selectorParam = Expression.Parameter(
GetType
(TSource),
"keySelector"
)
17.
Dim
sourceParam = Expression.Parameter(
GetType
(IEnumerable(Of TSource)),
"source"
)
18.
Return
Expression.Lambda(Of Func(Of IEnumerable(Of TSource),
19.
IOrderedEnumerable(Of TSource)))(Expression.[
Call
](orderBy_.MakeGenericMethod(
GetType
(TSource), pi.PropertyType),
20.
sourceParam, Expression.Lambda(
GetType
(Func(Of ,)).MakeGenericType(
GetType
(TSource), pi.PropertyType),
21.
Expression.[
Property
](selectorParam, pi), selectorParam)), sourceParam).Compile()(source)
22.
End
Function
23.
24.
<System.Runtime.CompilerServices.Extension()> _
25.
Public
Function
OrderBy(Of TSource)(source
As
IEnumerable(Of TSource), propertyName
As
String
, ascending
As
Boolean
)
As
IEnumerable(Of TSource)
26.
Return
If
(ascending, source.OrderBy(propertyName), source.OrderBy(propertyName).Reverse())
27.
End
Function
28.
29.
End
Module