在实现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
里面有大部的类型转换方式。