在這段代碼中, ps是一個事先分析了DB_Employees結構而得出的System.Rection.PropertyInfo數組,包含了 所有附加了BindFieldAttribute的成員屬性,它是調用GetBindPropertIEs函數獲得的返回值 。GetDefaultValue用於獲得針對某個屬性的默認值,若調用reader.GetValue( index )獲得 了一個空值,也就是DBNull.Value則設置屬性為默認值;GetValueString是將一個數值轉換 為C#代碼的表達樣式。然後針對不同的屬性數據類型生成對應的ConvertTo代碼。
函 數GetBindPropertIEs的代碼為
private System.Reflection.PropertyInfo[] GetBindPropertIEs( Type RecordType )
{
if( RecordType == null )
{
throw new ArgumentNullException("ReocrdType");
}
if( RecordType.IsPublic == false )
{
throw new ArgumentException("類型 " + RecordType.FullName + " 不是公開類型");
}
if( RecordType.IsClass == false )
{
throw new ArgumentException("類型 " + RecordType.FullName + " 不是類");
}
if( RecordType.IsAbstract )
{
throw new ArgumentException("類型 " + RecordType.FullName + " 不得是抽象類");
}
// 檢查是否有可用的無參數的構造函數
// 也就是判斷語句 Record obj = new Record() 是否有效
if( RecordType.GetConstructor( new Type[]{}) == null )
{
throw new ArgumentException("類型 " + RecordType.FullName + " 沒有默認構造函數" );
}
System.Collections.ArrayList propertIEs = new System.Collections.ArrayList ();
System.Reflection.PropertyInfo[] ps = RecordType.GetPropertIEs(
System.Reflection.BindingFlags.Instance
| System.Reflection.BindingFlags.Public );
foreach( System.Reflection.PropertyInfo p in ps )
{
BindFieldAttribute fa = ( BindFIEldAttribute ) Attribute.GetCustomAttribute(
p , typeof( BindFIEldAttribute ));
if( fa != null )
{
System.Reflection.ParameterInfo[] PPS = p.GetIndexParameters();
if( pps != null && PPS.Length > 0 )
{
throw new ArgumentException("屬性 " + RecordType.FullName + "." + p.Name + " 不得有參數");
}
Type pt = p.PropertyType ;
if( pt.IsPrimitive || pt.Equals( typeof( string )) || pt.Equals( typeof( DateTime )))
{
}
else
{
throw new ArgumentException("不支持屬性 " + RecordType.FullName + "." + p.Name + " 的數據類型 " + pt.FullName );
}
propertIEs.Add( p );
}
}
if( propertIEs.Count == 0 )
{
throw new ArgumentException("類型 " + RecordType.FullName + " 沒有標記為綁定到任何字段");
}
return ( System.Reflection.PropertyInfo[] ) propertIEs.ToArray( typeof( System.Reflection.PropertyInfo ));
}