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