ขึ้นต้นเป็นมะลิซ้อนพอแตกใบอ่อนเป็นมะลิลา
--- จาก List(Of Any Type) มันกลายเป็น IEnumerable(Of Any Type) ได้อย่างไร?
Code (VB.NET)
<Serializable> _
Public Class Product
Public Property ProductID As Integer
Public Property ProductNameTH As String
Public Property ProductNameUS As String
'...
End Class
Public Class GlobalSessions
Public Property ViewData As New List(Of Object)
Public Shared ReadOnly Property Current() As GlobalSessions
Get
Dim gs = DirectCast(HttpContext.Current.Session("__GS__"), GlobalSessions)
If gs Is Nothing Then
gs = New GlobalSessions()
HttpContext.Current.Session("__GS__") = gs
End If
Return gs
End Get
End Property
Public Shared Sub ClearSession()
GlobalSessions.Current.ViewData.Clear()
GlobalSessions.Current.ViewData = Nothing
HttpContext.Current.Session.Clear()
HttpContext.Current.Session.Abandon()
End Sub
End Class
'***** ทดสอบ *****
'Generic List
Dim lstProduct As New List(Of Product)() From {New Product With {.ProductID = 1, .ProductNameTH = "หอย"},
New Product With {.ProductID = 2, .ProductNameTH = "อร่อยดี"}
}
'Set Values
GlobalSessions.Current.ViewData = lstProduct.Cast(Of Object).ToList()
'Get Values มันกลายเป็น 'Generic IEnumerable ได้อย่างไร?
Dim lstProductGet = GlobalSessions.Current.ViewData.Cast(Of Product)()
Date :
2016-03-03 11:23:56
By :
หน้าฮี
No. 13
Guest
คุณลองสังเกตุดูดีฯนะ Source code ตัวอย่างของผม ไม่มี Name Space เลย (Bug ของ VB.NET)
เหตุผล : ผมมองเผื่อเอาไว้ ถ้าสักวันหนึ่งผมจำเป็นต้องเขียน C# ปัญหาจุกจิกกวนใจไม่มีแน่นอน (เตรียมการเอาไว้ตั้งแต่ปีมะโว้โน่น)
Imports System.Collections.Generic
Imports System.Linq
Imports System.Reflection
Imports System.Linq.Expressions
Public Module IEnumerableHelper
Sub New()
End Sub
Private orderBy_ As MethodInfo = GetType(Enumerable).GetMethods(BindingFlags.[Static] Or BindingFlags.[Public]) _
.Where(Function(x) x.Name = "OrderBy" AndAlso x.GetParameters().Length = 2).First()
<System.Runtime.CompilerServices.Extension()> _
Public Function OrderBy(Of TSource)(source As IEnumerable(Of TSource), propertyName As String) As IEnumerable(Of TSource)
Dim pi = GetType(TSource).GetProperty(propertyName, BindingFlags.[Public] Or BindingFlags.FlattenHierarchy Or BindingFlags.Instance)
Dim selectorParam = Expression.Parameter(GetType(TSource), "keySelector")
Dim sourceParam = Expression.Parameter(GetType(IEnumerable(Of TSource)), "source")
Return Expression.Lambda(Of Func(Of IEnumerable(Of TSource),
IOrderedEnumerable(Of TSource)))(Expression.[Call](orderBy_.MakeGenericMethod(GetType(TSource), pi.PropertyType),
sourceParam, Expression.Lambda(GetType(Func(Of ,)).MakeGenericType(GetType(TSource), pi.PropertyType),
Expression.[Property](selectorParam, pi), selectorParam)), sourceParam).Compile()(source)
End Function
<System.Runtime.CompilerServices.Extension()> _
Public Function OrderBy(Of TSource)(source As IEnumerable(Of TSource), propertyName As String, ascending As Boolean) As IEnumerable(Of TSource)
Return If(ascending, source.OrderBy(propertyName), source.OrderBy(propertyName).Reverse())
End Function
End Module
#if COREFX
using IDbTransaction = System.Data.Common.DbTransaction;
using IDbConnection = System.Data.Common.DbConnection;
using DataException = System.InvalidOperationException;
#else
using System.Threading;
#endif