เรื่องมันมีอยู่ว่าผมกำลังทำโปรแกรมสำหรับรองรับภาษาอะไรก็ได้บนโลก
โดยเริ่มต้นจะเป็นภาษาอังกฤษ ผมจึงสร้าง class ขึ้นมามี property อยู่ราวๆ 15,000
(หมายความว่า เก็บคำได้ 15,000 คำ) โดยแต่ละ property จะมีค่าว่างไว้ก่อน
และจะ set ค่าให้ property เหล่านั้นเมื่อเปิดโปรแกรม โดยค่าที่นำมา set จะเก็บไว้ใน xml ไฟล์
กระบวนการ คือ
1. ใช้ datatable อ่าน xml ไฟล์ใช้เวลาไม่ถึง 1 วินาที
2. ลูปเพื่อ set ค่าให้กับแต่ละ property โดยใช้คำสั่งดังนี้ Code (VB.NET)
Dim pType As Type = GetType(CurrentLanguage)
For Each dr As DataRow In gResourceTable.Rows
Dim name As String = dr("ResKey").ToString
Dim value2 As String = dr("ResDefualtText").ToString
Try
Dim pro As Reflection.PropertyInfo = pType.GetProperty(name, GetType(String))
pro.SetValue(gResourceClass, value2, Nothing)
pro = Nothing
Catch
End Try
Next
pType = Nothing
** คำอธิบาย
- CurrentLanguage เป็น Class ที่ว่าเก็บ Property 15,000 ค่า
- gResourceTable เป็น Datatable ที่ใช้อ่าน xml ไฟล์ขึ้นมา
- gResourceClass เป็น Object ของ CurrentLanguag ตั้งเป็น Public
var roles = from rt in XElement.Load(".....PATH...../Role.xml").Elements("Roles")
select rt;
// Execute the query
foreach (var role in roles )
{
int TypeID = Convert.ToInt32(role.Element("TypeID").Value);
string RoleName = role.Element("RoleName").Value;
}
Date :
2013-04-17 08:20:10
By :
ห้ามตอบเกินวันละ 2 กระทู้
No. 5
Guest
Code (VB.NET)
Imports System.Reflection
Imports System.ComponentModel
Public Class ReflectionButFaster
Public Class CurrentLanguage
Public Property ResKey As String
Public Property ResDefaultText As String
'more...
End Class
Protected Sub btnTestData_Click(sender As Object, e As EventArgs) Handles btnTestData.Click
Dim x As New List(Of CurrentLanguage)
For i As Integer = 0 To 100000 'หนึ่งแสนคำ
x.Add(New CurrentLanguage() With {.ResKey = "Test" & i, .ResDefaultText = String.Empty})
Next
MsgBox("Generate Test Data Complete")
For Each r In x
ReflectionButFaster(r, "ResDefaultText", "Love JimThai")
Next
MsgBox("Change Test Data Complete")
End Sub
Private Shared Sub ReflectionButFaster(ByVal obj As Object, ByVal PropertyName As String, ByVal NewValue As String)
Dim propsCollect As PropertyDescriptorCollection = TypeDescriptor.GetProperties(obj)
propsCollect(PropertyName).SetValue(obj, NewValue)
End Sub
End Class