dynamic 365 Class To Entity C#类转换crm实体

这段代码展示了如何将C#对象转换为CRM实体,并进行数据验证。它检查ID字段的唯一性,处理不同类型的属性(如Text、OptionSet、Money等),并使用自定义HelpAttribute进行映射。代码还包含了错误处理和异常抛出。
摘要由CSDN通过智能技术生成
   public static Entity ClassToEntity<T>(this T t) where T : new()
        {
            string entityName = t.GetType().GetField("CRMName").GetValue(null).ToString();
            Entity entity = new Entity(entityName);
            HelpAttribute helpAttr = null;
            List<PropertyInfo> propertys = t.GetType().GetProperties().ToList<PropertyInfo>();//获得属性
            foreach (PropertyInfo pInfo in propertys)//循环属性
            {

                object value = pInfo.GetValue(t, null);
                object[] HelpAttributes = pInfo.GetCustomAttributes(typeof(HelpAttribute), false);

                //获得 HelpAttribute 
                if (HelpAttributes.Length != 0 && HelpAttributes.Length == 1)
                {

                    helpAttr = HelpAttributes[0] as HelpAttribute;

                    //如果是ID列则去CRM查找获得ID
                    if (helpAttr.ISID)
                    {
                        #region 根据ID判断是否更新


                        //如果是ID 但是 值为空则报错
                        if (value == null)
                        {
                            throw new ApplicationException("未提供" + pInfo.Name + "的值,因此该字段为唯一值");
                        }
                        if (value != null && value.ToString().Trim().Length == 0)
                        {
                            throw new ApplicationException("未提供" + pInfo.Name + "的值,因此该字段为唯一值");
                        }

                        QueryExpression queryEntityQE = new QueryExpression
                        {
                            EntityName = entityName,
                            ColumnSet = new ColumnSet(helpAttr.CRMColName.ToLower()),
                            Criteria = new FilterExpression
                            {
                                Conditions =
                            {
                                new ConditionExpression
                                {
                                    AttributeName = helpAttr.CRMColName.ToLower(),
                                    Operator = ConditionOperator.Equal,
                                    Values = { value }
                                }
                            }
                            }
                        };
                        List<Entity> hasRecord = CrmService.OrgService().RetrieveMultiple(queryEntityQE).Entities.ToList<Entity>();
                        if (hasRecord.Count > 1)
                        {
                            throw new ApplicationException("数据异常:" + pInfo.Name + "的值重复!");
                        }
                        if (hasRecord.Count == 1)
                        {
                            entity.Id = hasRecord[0].Id;
                        }
                        #endregion
                    }


                    //构造Entity
                    if (helpAttr.CRMColName != "")
                        BuildEntityAttru(entity, helpAttr, value, pInfo);
                }

            }

            return entity;
        }

        /// <summary>
        /// 根据定义的HelpAttribute构造CRM实体
        /// </summary>
        /// <param name="entity">待构造实体</param>
        /// <param name="helpAttr">HelpAttribute对象</param>
        /// <param name="value">值</param>
        /// <param name="pro">反射对应PropertyInfo</param>
        /// <returns></returns>
        public static Entity BuildEntityAttru(Entity entity, HelpAttribute helpAttr, object value, PropertyInfo pro)
        {
            try
            {
                switch (helpAttr.CrmType)
                {
                    case CRMTYPE.Text:
                        entity[helpAttr.CRMColName.ToLower()] = value;
                        break;
                    case CRMTYPE.OptionSet:
                        {
                            if (value != null && value.ToString().Trim() != "")
                                entity[helpAttr.CRMColName.ToLower()] = new OptionSetValue(int.Parse(value.ToString()));
                            //如果等于空值什么也不做
                            //else
                            //entity[helpAttr.CRMColName.ToLower()] = null;


                        }
                        break;
                    case CRMTYPE.Monty:
                        entity[helpAttr.CRMColName.ToLower()] = value == null ? null : value.ToString().Trim().Length == 0 ? null : new Money(Decimal.Parse(value.ToString()));
                        break;
                    case CRMTYPE.LookUP:
                        {
                            if (value != null && value.ToString().Trim() != "")
                            {
                                object lookUP = ParseEntityReference(helpAttr, value.ToString());
                                if (lookUP != null)
                                    entity[helpAttr.CRMColName.ToLower()] = lookUP;
                                else
                                {
                                    entity[helpAttr.CRMColName.ToLower()] = null;
                                }
                            }
                            else
                            {
                                entity[helpAttr.CRMColName.ToLower()] = null;
                            }
                        }
                        break;
                    case CRMTYPE.LookUPWithValue:
                        {
                            if (value != null && value.ToString().Trim() != "" && !Guid.Empty.Equals(value))
                            {

                                entity[helpAttr.CRMColName.ToLower()] = new EntityReference(helpAttr.EntityName, new Guid(value.ToString()));

                            }
                            else
                            {
                                entity[helpAttr.CRMColName.ToLower()] = null;
                            }
                        }
                        break;
                    case CRMTYPE.Int:
                        entity[helpAttr.CRMColName.ToLower()] = value == null ? value : value.ToString().Trim().Length == 0 ? 0 : int.Parse(value.ToString());
                        break;
                    case CRMTYPE.Float:
                        entity[helpAttr.CRMColName.ToLower()] = value == null ? value : value.ToString().Trim().Length == 0 ? 0.00 : float.Parse(Convert.ToDecimal(value).ToString("0.00"));
                        break;
                    case CRMTYPE.DateTime:

                        if (value != null && value.ToString().Trim() != "")
                        {
                            entity[helpAttr.CRMColName.ToLower()] = DateTime.Parse(value.ToString());
                        }
                        else
                        {
                            entity[helpAttr.CRMColName.ToLower()] = null;
                        }
                        break;
                    case CRMTYPE.Bool:
                        entity[helpAttr.CRMColName.ToLower()] = value == null ? false : value.ToString().Trim().Length == 0 ? false : ParseBool(value.ToString());
                        break;
                    case CRMTYPE.SJZ:
                        entity[helpAttr.CRMColName.ToLower()] = value == null ? decimal.Parse("0.00") : value.ToString().Trim().Length == 0 ? decimal.Parse("0.00") : ChangeToDecimal(value, 2);
                        break;
                    default:
                        break;

                }

            }
            catch (Exception ex)
            {
                throw new ApplicationException("构造数据异常[实体:" + entity.LogicalName + "_属性:" + helpAttr.CRMColName + "_来源字段:" + pro.Name + "_值" + value.ToString() + "]" + ex.Message);
            }
            return entity;
        }

        public static decimal ChangeToDecimal(object d, int n)
        {
            string strDecimal = d.ToString();
            int index = strDecimal.IndexOf(".");
            if (index == -1 || strDecimal.Length < index + n + 1)
            {
                strDecimal = string.Format("{0:F" + n + "}", d);
            }
            else
            {
                int length = index;
                if (n != 0)
                {
                    length = index + n + 1;
                }
                strDecimal = strDecimal.Substring(0, length);
            }
            return Decimal.Parse(strDecimal);
        }
        public static bool ParseBool(string value)
        {
            bool returnValue = false;
            if (value == "是") returnValue = true;
            if (value == "否") returnValue = false;
            if (value.ToLower() == "t") returnValue = true;
            if (value.ToLower() == "f") returnValue = false;
            if (value.ToLower() == "true") returnValue = true;
            if (value.ToLower() == "false") returnValue = false;
            if (value.ToLower() == "1") returnValue = true;
            if (value.ToLower() == "0") returnValue = false;
            if (value.ToLower() == "y") returnValue = true;
            if (value.ToLower() == "n") returnValue = false;
            return returnValue;
        }
        /// <summary>
        /// 根据HelpAttribute 处理LookUp类型
        /// </summary>
        /// <param name="helpAttr">HelpAttribute</param>
        /// <param name="value">值</param>
        /// <returns></returns>
        public static EntityReference ParseEntityReference(HelpAttribute helpAttr, string value)
        {
            EntityReference entityRef = null;
            //根据Helpattr对应的
            try
            {
                QueryExpression qe = new QueryExpression(helpAttr.EntityName.ToLower().Trim());

                ConditionExpression ce = new ConditionExpression(helpAttr.EntityIDCol, ConditionOperator.Equal, value.Trim());
                qe.ColumnSet.AddColumn(helpAttr.EntityName.ToLower().Trim() + "id");
                qe.Criteria.AddCondition(ce);

                List<Entity> entity = CrmService.OrgService().RetrieveMultiple(qe).Entities.ToList<Entity>();
                if (entity.Count == 0) return null;
                if (entity.Count > 1) { throw new ApplicationException("获得到多个关联数据,相关数据重复[" + helpAttr.EntityIDCol + "]"); }
                Guid parentID = entity[0].Id;
                entityRef = new EntityReference(helpAttr.EntityName.ToLower().Trim(), parentID);
                return entityRef;
            }
            catch (Exception ex)
            {
                throw new ApplicationException(ex.Message, ex);
            }
        }
    [AttributeUsage(AttributeTargets.Property, AllowMultiple = true, Inherited = false)]
    //是用于在运行时传递程序中各种元素(比如类、方法、结构、枚举、组件等)的行为信息的声明性标签。
    public class HelpAttribute : Attribute
    {

        protected string _CRMColName;
        protected CRMTYPE _CrmType;
        protected bool _CanNullInCRM;
        protected string _EntityName;
        protected string _EntityIDCol;
        protected object _DefaultValue;
        protected bool _ISID;

        public string CRMColName { get { return _CRMColName; } }
        public CRMTYPE CrmType { get { return _CrmType; } }
        public bool CanNullInCRM { get { return _CanNullInCRM; } }
        public string EntityName { get { return _EntityName; } }
        public string EntityIDCol { get { return _EntityIDCol; } }
        public object DefaultValue { get { return _DefaultValue; } }
        public bool ISID { get { return _ISID; } }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="CRMColName">对应crm列名字</param>
        /// <param name="CrmType">crm类型</param>
        /// <param name="CanNullInCRM">是否查找字段</param>
        /// <param name="EntityName">crm查询字段</param>
        /// <param name="EntityIDCol">crm查询字段值</param>
        /// <param name="DefaultValue">默认值</param>
        /// <param name="ISID">是否主键</param>
        public HelpAttribute(string CRMColName, CRMTYPE CrmType, bool CanNullInCRM, string EntityName, string EntityIDCol, object DefaultValue, bool ISID)
        {
            this._CRMColName = CRMColName;
            this._CrmType = CrmType;
            this._CanNullInCRM = CanNullInCRM;
            this._EntityName = EntityName;
            this._EntityIDCol = EntityIDCol;
            this._DefaultValue = DefaultValue;
            this._ISID = ISID;
        }

        public enum CRMTYPE : uint
        {
            LookUP = 1,
            OptionSet = 2,
            DateTime = 3,
            Text = 4,
            Monty = 5,
            Int = 6,
            Float = 7,
            Bool = 8,
            LookUPWithValue = 9,
            SJZ = 10

        }

    }
  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值