Literacy 說明
Literacy使用IL指令生成方法委托,性能方面,在調用次數達到一定量的時候比反射高很多
當然,用IL指令生成一個方法也是有時間消耗的,所以在只使用一次或少數幾次的情況,不但不能提高性能,反而會使性能下降,所以使用場合需要自己把握
下面是在我的電腦上做的一些測試(因機器配置不同會有少許誤差)
測試次數 | Literacy | 反射 |
10 | 16ms | 0ms |
100 | 15ms | 0ms |
1K | 16ms | 5ms |
1W | 16ms | 50ms |
10W | 23ms | 505ms |
100W | 87ms | 5149ms |
所以可以看出,再次數越多的時候和反射的差距越大,在100次以下反射幾乎不消耗時間,而IL生成委托就要消耗16ms
關於IL指令生成方法可以參考
Literacy 常用屬性方法
Literacy 方法 | |
Literacy(Type type) | 構造函數,加載所有公開屬性 |
Literacy(Type type, bool ignoreCase) | 構造函數,加載所有公開屬性 ignoreCase 指示屬性名是否區分大小寫 |
NewObject() | 調用對象的無參構造函數,新建對象 |
Literacy 靜態方法 | |
CreateNewObject(Type type, Type[] argTypes = null) | IL構造一個用於調用對象指定構造函數的委托 |
CreateGetter(PropertyInfo prop) | IL構造一個用於獲取對象屬性值的委托 |
CreateGetter(FieldInfo field) | IL構造一個用於獲取對象字段值的委托 |
CreateSetter(PropertyInfo prop) | IL構造一個用於設置對象屬性值的委托 |
CreateSetter(FieldInfo field) | IL構造一個用於設置對象字段值的委托 |
Literacy.Load 屬性 | |
Load.PublicField() | 加載公開的實例字段 |
Load.NonPublicField() | 加載非公開的實例字段 |
Load.StaticField(bool hasNonPublic) | 加載公開靜態的字段 參數hasNonPublic指示是否同時加載非公開的靜態字段 |
Load.NonPublicProperty() | 加載非公開的實例屬性 |
Load.StaticProperty(bool hasNonPublic) | 加載公開靜態的屬性 參數hasNonPublic指示是否同時加載非公開的靜態屬性 |
Literacy.Property 屬性 | |
Property[string name] | 獲取指定屬性的ObjectProperty對象 |
Property[string name].GetValue(obj instance) | 獲取實例對象的指定屬性的值 |
Property[string name].TryGetValue(object instance, out object value) | 嘗試獲取實例對象的指定屬性的值,失敗返回false |
Property[string name].SetValue(object instance, object value) | 設置實例對象的指定屬性的值 |
Property[string name].TrySetValue(object instance, object value) | 嘗試設置實例對象的指定屬性的值,失敗返回false |
Literacy.Field 屬性 | 如果沒有手動加載字段,該屬性為null |
Field[string name] | 獲取指定字段的ObjectProperty對象 |
Field[string name].GetValue(obj instance) | 獲取實例對象的指定字段的值 |
Field[string name].TryGetValue(object instance, out object value) | 嘗試獲取實例對象的指定字段的值,失敗返回false |
Field[string name].SetValue(object instance, object value) | 設置實例對象的指定字段的值 |
Field[string name].TrySetValue(object instance, object value) | 嘗試設置實例對象的指定字段的值,失敗返回false |
Literacy調用實例
Literacy源碼下載