C# 反射 如何動態獲取/設置數組,列表,字典中的中值

在實現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
裏面有大部的類型轉換方式。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章