/// <summary>
 /// 使用PropertyDescriptor映射(或IDataRowSetter接口,如果对象实IDataRowSetter接口)设置属性值
 /// </summary>
 /// <param name="des"></param>
 /// <param name="propertyname"></param>
 /// <param name="propertyvalue"></param>
 public static void SetMemberValue(this object des, string membername, object membervalue)
 {
     if (des == null)
     {
         return;
     }
     try
     {
         if (des is IDataRowSetter)
         {
             IDataRowSetter s = des as IDataRowSetter;
             s.SetFieldValue(membername, membervalue);
             return;
         }
         PropertyDescriptorCollection pdcols = TypeDescriptor.GetProperties(des);
         PropertyDescriptor           pd     = pdcols[membername];
         if (pd != null)
         {
             if (membervalue != null && pd.PropertyType.IsNullableType() && pd.PropertyType.GetTypeIfIsNullable().IsEnum)
             {
                 //防止 从int类型到enum?类型的转换无效错误
                 object v = Enum.ToObject(pd.PropertyType.GetTypeIfIsNullable(), membervalue);
                 pd.SetValue(des, v);
             }
             else
             {
                 pd.SetValue(des, membervalue);
             }
         }
     }
     catch (Exception e)
     {
         throw new UnkownCodeException(ErrorCodes.SetMemberValueError, string.Format(LocalResource.SetMemberValueError, des.GetType().FullName, membername, e.Message));
     }
 }
        public static DataTable StartShema(this IDataRowSetter source)
        {
            DataTable dt = new DataTable(source.GetType().Name);

            dt.ExtendedProperties[templateFieldDataTable.shema_sourceinstance] = source;
            dt.ExtendedProperties[templateFieldDataTable.shema_classname]      = source.GetType().Name;

            return(dt);
        }
        /// <summary>
        /// 设置数据data的字段值为fieldvalue
        /// <para>如果data实现接口IDataRowSetter,则调用IDataRowSetter.SetFieldValue</para>
        /// </summary>
        /// <param name="field"></param>
        /// <param name="data">要设置值的数据</param>
        /// <param name="fieldvalue">要设置为的字段值</param>
        public static void SetModelFieldValue(this IDataFieldModel field, object data, object fieldvalue)
        {
            if (data is IDataRowSetter)
            {
                IDataRowSetter s = data as IDataRowSetter;
                s.SetFieldValue(field.Name, fieldvalue);
                return;
            }
            PropertyDescriptor pd = DataModelHelper.GetExtendProerty_PropertyDescription(field.InnerExtend);

            if (pd != null)
            {
                pd.SetValue(data, fieldvalue);
            }
            else
            {
                throw new ObjectIsNullException(LocalResource.FieldPropertyDescriptor);
            }
        }