在實現ToTxt 時,碰到這些問題,在此記錄一下:
1.數組與List:
讀取數組與列表
數組與List 均有實現IList
接口,所以在反射時,獲取FieldInfo.FiledType
後,可以使用typeof(IList).IsAssignableFrom(fieldType)
的方式來判斷字段類型是否繼承了IList
。
如果需要讀取IList中值 ,使用FieldInfo.GetValue()
獲取到值後,轉爲IList循環遍歷即可。
動態創建數組或列表:
數組:需要使用Array.CreateInstance (elementType, Length)
方式創建一個新的數組,elementType
爲數組類型,可以通過fieldType.GetElementType ()
的方式獲取,length
爲數組的長度。然後使用Array.SetValue(object,index)
方法將元素插入。
列表:需要使用Activator.CreateInstance (fieldType)
方式創建一個新的list,filedType
爲列表類型,使用FieldInfo.FiledType
即可。然後將創建list轉爲IList
,使用IList.Add(object)
的方法將元素插入。
經過以上操作後使用FieldInfo.SetValue(instance,value)
的方式對實例進行賦值。
2.字典:
字典有實現IDictionary
接口,所以可使用使用typeof(IDictionary).IsAssignableFrom (fieldType)
的方式來判斷字段類型是否繼承了IDictionary
。
讀取字典:
獲取到值後,將值轉爲IDictionary類型,獲取字段長度,然後通過dic.GetEnumerator ()
的方式獲取IDictionaryEnumerator
,for循環獲取IDictionaryEnumerator
即可:
IDictionary dic = obj as IDictionary;
int count = dic.Count;
IDictionaryEnumerator enu = dic.GetEnumerator ();
for (int i = 0; i < count; i++) {
enu.MoveNext ();
if (i != 0) sb.Append (",");
string key = SeriElement (enu.Key);
string value = SeriElement (enu.Value);
sb.Append (string.Format ("{0}={1}", key, value));
}
動態創建字典:
與list的創建基本上相似,都需要使用Activator.CreateInstance (fieldType)
,然後將創建實例轉爲IDictionary
,通過IDictionary.Add (object key, object value)
方法添加元素。最後使用FiledInfo.SetValue(instance,value)
對實例盡心賦值。
更爲詳盡的代碼可以查看ToTxt源碼:https://editor.csdn.net/md/?articleId=105180028
裏面有大部的類型轉換方式。