最近工作中需要做一些机械的结构体字段比较,由于程序中用到的结构体,枚举等类型实在太多大约有2000种之多!加之各个字段都需要一一比对!哦,我的神啊,如果每一个都用手写assert,我想一天下来,即使我的手不抽筋,眼睛也必将受不了!
听说.NET有个反射机制,于是懒病发作,再于是有了可以自动生成assert文本的程序!但是为了展示问题关键,我这里只给个演示程序:C#控制台程序
文件1:Definitions.cs 一些结构体,枚举类型定义
- using System;
- using System.Reflection;
- namespace Reflaction.Definitions
- {
- #region bitmap structures
- /// <summary>
- /// bitmap file struct
- /// </summary>
- public struct BITMAP_FILE
- {
- /// <summary>
- /// bitmap file header struct
- /// </summary>
- public BmpFileHeader bmpfh;
- /// <summary>
- /// bitmap info struct
- /// </summary>
- public BmpInfo bmpinfo;
- /// <summary>
- /// bitmap data struct
- /// </summary>
- public BmpData bmpdata;
- }
- ... ...
- }
文件2:Program.cs 主程序
- using System;
- using System.Reflection;
- using Reflaction.Definitions;
- namespace Reflaction
- {
- class Program
- {
- static void Main(string[] args)
- {
- System.Console.WriteLine("--------------------------------------------------------------------");
- System.Console.WriteLine(" .NET框架下支持的反射机制演示程序 ");
- System.Console.WriteLine(" by Loomman, QQ:28077188, MSN: Loomman@hotmail.com QQ裙:30515563 ");
- System.Console.WriteLine("--------------------------------------------------------------------");
- Type[] types = Assembly.GetExecutingAssembly().GetTypes();
- FieldInfo[] fieldInfo = null;
- string sTypeName = null;
- foreach (Type t in types)
- {
- switch (t.BaseType.Name)
- {
- case "Object":
- sTypeName = "class";
- break;
- case "ValueType":
- sTypeName = "struct";
- break;
- case "Enum":
- sTypeName = "enum";
- break;
- }
- System.Console.WriteLine("/n" + sTypeName + " " + t.Name);
- System.Console.WriteLine("{");
- fieldInfo = t.GetFields();
- foreach (FieldInfo f in fieldInfo)
- {
- System.Console.WriteLine(" " + f.FieldType.Name + " " + f.Name + ";");
- }
- System.Console.WriteLine("}");
- }
- System.Console.ReadLine();
- }
- }
- }
运行的结果:
--------------------------------------------------------------------
.NET框架下支持的反射机制演示程序
by Loomman, QQ:28077188, MSN: Loomman@hotmail.com QQ裙:30515563
--------------------------------------------------------------------
class Program
{
}
struct BITMAP_FILE
{
BmpFileHeader bmpfh;
BmpInfo bmpinfo;
BmpData bmpdata;
}
struct BmpFileHeader
{
Int16 bfType;
UInt32 bfSize;
Int16 bfReserved1;
Int16 bfReserved2;
UInt32 bfOffBits;
}
struct BmpInfo
{
BmpInfoHeader bmiHeader;
RGBQUAD[] bmiColors;
}
struct BmpInfoHeader
{
UInt32 biSize;
UInt32 biWidth;
UInt32 biHeight;
Int16 biPlanes;
Int16 biBitCount;
UInt32 biCompression;
UInt32 biSizeImage;
UInt32 biXPelsPerMeter;
UInt32 biYPelsPerMeter;
UInt32 biClrUsed;
UInt32 biClrImportant;
}
struct RGBQUAD
{
Byte rgbBlue;
Byte rgbGreen;
Byte rgbRed;
Byte rgbReserved;
}
struct BmpData
{
Byte[] bmpdata;
}
enum TransformRecordTypes_Type_Values
{
UInt32 value__;
TransformRecordTypes_Type_Values EMR_SETWORLDTRANSFORM;
TransformRecordTypes_Type_Values EMR_MODIFYWORLDTRANSFORM;
}
呵呵,还真不赖嘛:)by Loomman, QQ:28077188, MSN: Loomman@hotmail.com QQ裙:30515563 ☆程序天堂☆ 请尊重作者原创,转载注明来自裂帛一剑博客,谢谢合作。