之前在網上看到的都是遍歷那種比較簡單的實體物件,但是如果有實體巢狀,甚至是包含有list這種屬性的時候就沒有辦法處理了。通過遞迴遍歷的方式可以完成對複雜實體物件的所有屬性的遍歷,可以取值和賦值。
下面是關鍵部分的**,有什麼不對的地方路過的大大一定要指點哈。
using system.reflection;}}
利用反射實現**式excel文件的匯出:
上次客戶提出了要將資料匯出到類似上圖的固定格式的excel文件中,當然真實的**不是上面那樣的,而且**的格式有十多種,最後採用的解決辦法就是利用c#的反射。大概的思路是這樣的,為每種匯出的**樣式都做乙個xml的配置檔案,然後記錄每個需要複製的文字框的座標,以及這個值在實體類中的名稱,針對上面的那種**格式,xml配置檔案是這樣的:
<?xml version="1.0" encoding="utf-8"?>
43
10344
10445
105131
18
3858
78然後從資料庫中獲取資料存入到實體類中,用反射遍歷實體類的所有屬性,如果xml中得propertyname節點的值和當前屬性的屬性名相等,那麼就可以通過xml提供的座標給excel**賦值了。這樣做的乙個好處是,可以實現不同**的通用賦值,即使翻頁顯示也能應對(比如上面的銷售記錄每頁只能顯示4條,而程式中是構造的10條銷售記錄,只能通過分頁顯示完),不用為每種格式都去寫一種實現,即使**的樣式有所變動也不用改程式,只需更改一下xml就好了。
語言組織和表達的能力不行,還是直接上碼:
using system;
using system.collections.generic;
using system.web;
using system.reflection;
using system.xml;
///
///excel匯出
///
public class excelexport
///
/// 模擬從資料庫獲取資料
///
///
public employee getinfo()
return e;
}// }
// }
// }
//}///
/// 屬性賦值
///
public employee setpropertyvalue()
employee emp = getinfo();
listlist = formatemplyeeobj(emp);
for (int i = 0; i < list.count;i++ )
}foreach (employee emptemp in list)
excel.close(true);
return emp;
}///
/// 設定值
///
private void setvalue()
}///
/// 格式化員工物件,便於翻頁顯示
///
public listformatemplyeeobj(employee emp)
else
list.add(infotemp);}}
}return list;
}///
/// 實體物件拷貝
///
///
///
public void cloneentityobject(object srcobj, object desobj)
if (srcobj.gettype() != desobj.gettype())
system.reflection.propertyinfo info = srcobj.gettype().getproperties();
foreach (system.reflection.propertyinfo property in info)
}另外excel的操作類在之前的文章中有,這裡就不再貼了。
用棧明白遞迴原理
遞迴 如果在乙個函式 過程或資料結構的定義又應用了它自身,那麼這個函式 過程或資料結構稱是遞迴定義的,簡稱遞迴。遞迴最重要的是遞迴式和遞迴邊界。簡化說明 乙個函式呼叫自己 函式中有終止條件 通過符號來連線返回的函式 用棧解釋 斐波那契數列 int f n if n 1 else 運用遞迴的時候,系統...
C 基礎系列 反射的原理
反射 reflection 的內容在部落格中已經寫了一篇,什麼是反射,反射的使用,反射優缺點總結 在面試中突然被問道反射的原理,按照理解反射就是在reflection命名空間和物件的type物件獲取類的方法 屬性 特性等成員資訊,但是又被問道為什麼可以獲取這些成員資訊?就是反射機制依據的是什麼,讓其...
BinaryTree 遞迴遍歷 建樹 C語言
include include include typedef char eleltype 定義結構體 typedef struct btnode,binarytree 申請結點 btnode buynode 釋放結點 void freenode btnode p 遞迴先序遍歷二叉樹 void pr...