private void gridView2_ValidateRow(object sender, DevExpress.XtraGrid.Views.Base.ValidateRowEventArgs e)
        {
            int i = this.gridView1.FocusedRowHandle;

            if (i >= 0)
            {
                //如果e.Valid等于false就会触发InvalidRowException事件
                CustClassInfo    citem = CustClassManager.Instance.AllClasses[i];
                CustPropertyInfo item  = (CustPropertyInfo)e.Row;
                if (!item.PropertyName.StartsWith("property_"))
                {
                    item.PropertyName = "property_" + item.PropertyName;  //属性名前面加个前缀
                }
                //item.PropertyName = item.PropertyName.ToUpper();

                //校验属性名是否为字母开头
                if (!CustClassManager.regex字母开头.IsMatch(item.PropertyName))
                {
                    e.Valid = false;
                    return;
                }

                if (citem.PropertyInfos.ToList().Where(p => p.PropertyName.Equals(item.PropertyName)).Count() > 1)
                {
                    e.Valid = false;
                }
            }
        }
Esempio n. 2
0
 /// <summary>
 /// 给对象实例添加新属性并返回新对象实例
 /// </summary>
 /// <param name="obj"></param>
 /// <param name="cpi">自定义属性对象</param>
 /// <returns></returns>
 public static object AddProperty(this object obj, CustPropertyInfo cpi)
 {
     return(AddProperty(obj, new List <CustPropertyInfo>()
     {
         cpi
     }));
 }
Esempio n. 3
0
        /**//// <summary>
        /// 从类型的实例中移除属性,注意:该操作会将其它成员清除掉,其功能有待完善。
        /// </summary>
        /// <param name="classType">指定类型的实例。</param>
        /// <param name="ls">要移除的属性列表。</param>
        /// <returns>返回处理过的类型的实例。</returns>
        public static Type DeleteProperty(Type classType, List <string> ls)
        {
            //合并先前的属性,以便一起在下一步进行处理。
            List <CustPropertyInfo> lcpi = SeparateProperty(classType, ls);

            //把属性加入到Type。
            return(AddPropertyToType(classType, lcpi));
        }

        #endregion

        #region 私有方法
        /**//// <summary>
        /// 把类型的实例t和lcpi参数里的属性进行合并。
        /// </summary>
        /// <param name="t">实例t</param>
        /// <param name="lcpi">里面包含属性列表的信息。</param>
        private static void MergeProperty(Type t, List <CustPropertyInfo> lcpi)
        {
            foreach (PropertyInfo pi in t.GetProperties())
            {
                CustPropertyInfo cpi = new CustPropertyInfo(pi.PropertyType.FullName, pi.Name);
                lcpi.Add(cpi);
            }
        }
Esempio n. 4
0
        /// <summary>添加属性到类型的实例,注意:该操作会将其它成员清除掉,其功能有待完善。 </summary>
        /// <param name="classType">指定类型的实例。</param>
        /// <param name="cpi">表示一个属性。</param>
        /// <returns>返回处理过的类型的实例。</returns>
        public static Type AddProperty(Type classType, CustPropertyInfo cpi)
        {
            List <CustPropertyInfo> lcpi = new List <CustPropertyInfo>();

            lcpi.Add(cpi);
            MergeProperty(classType, lcpi);
            return(AddPropertyToType(classType, lcpi));
        }
Esempio n. 5
0
        /**/
        /// <summary>
        /// 添加属性到类型的实例,注意:该操作会将其它成员清除掉,其功能有待完善。
        /// </summary>
        /// <param name="classType">指定类型的实例。</param>
        /// <param name="lcpi">表示属性的一个列表。</param>
        /// <returns>返回处理过的类型的实例。</returns>
        public static Type AddProperty(Type classType, List<CustPropertyInfo> lcpi)
        {
            //合并先前的属性,以便一起在下一步进行处理。
            MergeProperty(classType, lcpi);
            //把属性加入到Type。
            return AddPropertyToType(classType, lcpi);
        }

        /**/
        /// <summary>
        /// 添加属性到类型的实例,注意:该操作会将其它成员清除掉,其功能有待完善。
        /// </summary>
        /// <param name="classType">指定类型的实例。</param>
        /// <param name="cpi">表示一个属性。</param>
        /// <returns>返回处理过的类型的实例。</returns>
        public static Type AddProperty(Type classType, CustPropertyInfo cpi)
        {
            List<CustPropertyInfo> lcpi = new List<CustPropertyInfo>();
            lcpi.Add(cpi);
            //合并先前的属性,以便一起在下一步进行处理。
            MergeProperty(classType, lcpi);
            //把属性加入到Type。
            return AddPropertyToType(classType, lcpi);
        }
Esempio n. 6
0
        /**//// <summary>
            /// 添加属性到类型的实例,注意:该操作会将其它成员清除掉,其功能有待完善。
            /// </summary>
            /// <param name="classType">指定类型的实例。</param>
            /// <param name="lcpi">表示属性的一个列表。</param>
            /// <returns>返回处理过的类型的实例。</returns>
        public static Type AddProperty(Type classType, List <CustPropertyInfo> lcpi)
        {
            //合并先前的属性,以便一起在下一步进行处理。
            MergeProperty(classType, lcpi);
            //把属性加入到Type。
            return(AddPropertyToType(classType, lcpi));
        }

        /**//// <summary>
            /// 添加属性到类型的实例,注意:该操作会将其它成员清除掉,其功能有待完善。
            /// </summary>
            /// <param name="classType">指定类型的实例。</param>
            /// <param name="cpi">表示一个属性。</param>
            /// <returns>返回处理过的类型的实例。</returns>
        public static Type AddProperty(Type classType, CustPropertyInfo cpi)
        {
            List <CustPropertyInfo> lcpi = new List <CustPropertyInfo>();

            lcpi.Add(cpi);
            //合并先前的属性,以便一起在下一步进行处理。
            MergeProperty(classType, lcpi);
            //把属性加入到Type。
            return(AddPropertyToType(classType, lcpi));
        }
Esempio n. 7
0
        public static Type AddProperty(Type classType, CustPropertyInfo cpi)
        {
            var lcpi = new List <CustPropertyInfo>
            {
                cpi
            };

            MergeProperty(classType, lcpi);

            return(AddPropertyToType(classType, lcpi));
        }
Esempio n. 8
0
        /// <summary>
        /// 添加属性到类型的实例,注意:该操作会将其它成员清除掉,其功能有待完善。
        /// </summary>
        /// <param name="classType">指定类型的实例。</param>
        /// <param name="cpi">表示一个属性。</param>
        /// <returns>返回处理过的类型的实例。</returns>
        public static Type AddProperty(this Type classType, CustPropertyInfo cpi)
        {
            var lcpi = new List <CustPropertyInfo>
            {
                cpi
            };

            //合并先前的属性,以便一起在下一步进行处理。
            MergeProperty(classType, lcpi);
            //把属性加入到Type。
            return(AddPropertyToType(classType, lcpi));
        }
Esempio n. 9
0
        /// <summary>
        /// 从类型的实例t的属性移除属性列表lcpi,返回的新属性列表在lcpi中。
        /// </summary>
        /// <param name="t">类型的实例t。</param>
        /// <param name="ls">要移除的属性列表。</param>
        private static List <CustPropertyInfo> SeparateProperty(Type t, List <string> ls)
        {
            List <CustPropertyInfo> ret = new List <CustPropertyInfo>();

            foreach (PropertyInfo pi in t.GetProperties())
            {
                foreach (string s in ls)
                {
                    if (pi.Name != s)
                    {
                        CustPropertyInfo cpi = new CustPropertyInfo(pi.PropertyType.FullName, pi.Name);
                        ret.Add(cpi);
                    }
                }
            }

            return(ret);
        }
Esempio n. 10
0
        /**/
        /// <summary>
        /// 把lcpi参数里的属性加入到myTypeBuilder中。注意:该操作会将其它成员清除掉,其功能有待完善。
        /// </summary>
        /// <param name="myTypeBuilder">类型构造器的实例。</param>
        /// <param name="lcpi">里面包含属性列表的信息。</param>
        private static void AddPropertyToTypeBuilder(TypeBuilder myTypeBuilder, List<CustPropertyInfo> lcpi)
        {
            FieldBuilder customerNameBldr;
            PropertyBuilder custNamePropBldr;
            MethodBuilder custNameGetPropMthdBldr;
            MethodBuilder custNameSetPropMthdBldr;
            MethodAttributes getSetAttr;
            ILGenerator custNameGetIL;
            ILGenerator custNameSetIL;

            // 属性Set和Get方法要一个专门的属性。这里设置为Public。
            getSetAttr =
                MethodAttributes.Public | MethodAttributes.SpecialName |
                    MethodAttributes.HideBySig;

            // 添加属性到myTypeBuilder。
            foreach (CustPropertyInfo cpi in lcpi)
            {
                //定义字段。
                customerNameBldr = myTypeBuilder.DefineField(cpi.FieldName,
                                                                 Type.GetType(cpi.Type),
                                                                 FieldAttributes.Private);

                //定义属性。
                //最后一个参数为null,因为属性没有参数。
                custNamePropBldr = myTypeBuilder.DefineProperty(cpi.PropertyName,
                                                                 PropertyAttributes.HasDefault,
                                                                 Type.GetType(cpi.Type),
                                                                 null);

                //定义Get方法。
                custNameGetPropMthdBldr =
                    myTypeBuilder.DefineMethod(cpi.GetPropertyMethodName,
                                               getSetAttr,
                                               Type.GetType(cpi.Type),
                                               Type.EmptyTypes);

                custNameGetIL = custNameGetPropMthdBldr.GetILGenerator();

                custNameGetIL.Emit(OpCodes.Ldarg_0);
                custNameGetIL.Emit(OpCodes.Ldfld, customerNameBldr);
                custNameGetIL.Emit(OpCodes.Ret);

                //定义Set方法。
                custNameSetPropMthdBldr =
                    myTypeBuilder.DefineMethod(cpi.SetPropertyMethodName,
                                               getSetAttr,
                                               null,
                                               new Type[] { Type.GetType(cpi.Type) });

                custNameSetIL = custNameSetPropMthdBldr.GetILGenerator();

                custNameSetIL.Emit(OpCodes.Ldarg_0);
                custNameSetIL.Emit(OpCodes.Ldarg_1);
                custNameSetIL.Emit(OpCodes.Stfld, customerNameBldr);
                custNameSetIL.Emit(OpCodes.Ret);

                //把创建的两个方法(Get,Set)加入到PropertyBuilder中。
                custNamePropBldr.SetGetMethod(custNameGetPropMthdBldr);
                custNamePropBldr.SetSetMethod(custNameSetPropMthdBldr);
            }
        }

        /**/
        /// <summary>
        /// 把类型的实例t和lcpi参数里的属性进行合并。
        /// </summary>
        /// <param name="t">实例t</param>
        /// <param name="lcpi">里面包含属性列表的信息。</param>
        private static void MergeProperty(Type t, List<CustPropertyInfo> lcpi)
        {
            CustPropertyInfo cpi;
            foreach (PropertyInfo pi in t.GetProperties())
            {
                cpi = new CustPropertyInfo(pi.PropertyType.FullName, pi.Name);
                lcpi.Add(cpi);
            }
        }
Esempio n. 11
0
        /// <summary>
        /// 从类型的实例t的属性移除属性列表lcpi,返回的新属性列表在lcpi中。
        /// </summary>
        /// <param name="t">类型的实例t。</param>
        /// <param name="ls">要移除的属性列表。</param>
        private static List<CustPropertyInfo> SeparateProperty(Type t, List<string> ls)
        {
            List<CustPropertyInfo> ret = new List<CustPropertyInfo>();
            foreach (PropertyInfo pi in t.GetProperties())
            {
                foreach (string s in ls)
                {
                    if (pi.Name != s)
                    {
                        CustPropertyInfo cpi = new CustPropertyInfo(pi.PropertyType.FullName, pi.Name);
                        ret.Add(cpi);
                    }
                }
            }

            return ret;
        }
Esempio n. 12
0
    public static void Main2()
    {
        #region 演示一:动态生成类。
        //生成一个类t。
        Type t = ClassDynamicCreater.BuildType("MyClass");
        #endregion

        #region 演示二:动态添加属性到类。
        //先定义两个属性。
        List <CustPropertyInfo> lcpi = new List <CustPropertyInfo>();
        CustPropertyInfo        cpi;

        cpi = new CustPropertyInfo("System.String", "S1");
        lcpi.Add(cpi);
        cpi = new CustPropertyInfo("System.String", "S2");
        lcpi.Add(cpi);

        //再加入上面定义的两个属性到我们生成的类t。
        t = ClassDynamicCreater.AddProperty(t, lcpi);

        //把它显示出来。
        DispProperty(t);

        //再定义三个属性。
        lcpi.Clear();
        cpi = new CustPropertyInfo(SystemDataType.Int, "I1");  //"System.Int32"
        lcpi.Add(cpi);
        cpi = new CustPropertyInfo("System.Int32", "I2");
        lcpi.Add(cpi);
        cpi = new CustPropertyInfo("System.Object", "O1");
        lcpi.Add(cpi);

        //再加入上面定义的三个属性到我们生成的类t。
        t = ClassDynamicCreater.AddProperty(t, lcpi);

        //再把它显示出来,看看有没有增加到5个属性。
        DispProperty(t);
        #endregion

        #region 演示三:动态从类里删除属性。
        //把'S1'属性从类t中删除。
        t = ClassDynamicCreater.DeleteProperty(t, "S1");
        //显示出来,可以看到'S1'不见了。
        DispProperty(t);

        #endregion

        #region 演示四:动态获取和设置属性值。
        //先生成一个类t的实例o。
        object o = ClassDynamicCreater.CreateInstance(t);

        //给S2,I2,O1属性赋值。
        ClassDynamicCreater.SetPropertyValue(o, "S2", "abcd");
        ClassDynamicCreater.SetPropertyValue(o, "I2", 1234);
        ClassDynamicCreater.SetPropertyValue(o, "O1", 7.5);

        //再把S2,I2,01的属性值显示出来。
        Console.WriteLine("S2 = {0}", ClassDynamicCreater.GetPropertyValue(o, "S2"));
        Console.WriteLine("I2 = {0}", ClassDynamicCreater.GetPropertyValue(o, "I2"));
        Console.WriteLine("O1 = {0}", ClassDynamicCreater.GetPropertyValue(o, "O1"));
        #endregion

        #region 演示五:类嵌套设置属性值

        Type t2 = ClassDynamicCreater.BuildType("MyClass2");
        List <CustPropertyInfo> lcpi2 = new List <CustPropertyInfo>();
        CustPropertyInfo        cpi2;

        //cpi2 = new CustPropertyInfo(t.FullName, "mc");  //t2类中加入一个t属性
        cpi2 = new CustPropertyInfo(t, "MC");  //t2类中加入一个t属性
        lcpi2.Add(cpi2);
        TypeInfo tInfo = t.GetTypeInfo();

        //t2类中加入一个t类的列表属性
        //cpi2 = new CustPropertyInfo(typeof(List<>), "MCL");
        cpi2 = new CustPropertyInfo(typeof(List <>), t, "MCL");
        lcpi2.Add(cpi2);

        t2 = ClassDynamicCreater.AddProperty(t2, lcpi2);

        DispProperty(t2);

        //先生成一个类t2的实例o。
        object o2 = ClassDynamicCreater.CreateInstance(t2);

        //给MC属性赋值。
        ClassDynamicCreater.SetPropertyValue(o2, "MC", o);   //o是类t的一个实例
        //给MCL属性赋值。
        dynamic Dynamic = ClassDynamicCreater.CreateGeneric(typeof(List <>), t);
        //object o = ClassDynamicCreater.CreateInstance(t);
        dynamic o1 = o;
        Dynamic.Add(o1);
        ClassDynamicCreater.SetPropertyValue(o2, "MCL", Dynamic);

        //再把mc属性值显示出来。
        Console.WriteLine("MC = {0}", ClassDynamicCreater.GetPropertyValue(o2, "MC"));

        #endregion

        object genericList = ClassDynamicCreater.CreateGeneric(typeof(List <>), typeof(StudentTest));

        dynamic dynamic = genericList;
        dynamic.Add(new StudentTest());

        Console.Read();
    }