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; } } }
/// <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 })); }
/**//// <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); } }
/// <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)); }
/**/ /// <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); }
/**//// <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)); }
public static Type AddProperty(Type classType, CustPropertyInfo cpi) { var lcpi = new List <CustPropertyInfo> { cpi }; MergeProperty(classType, lcpi); return(AddPropertyToType(classType, lcpi)); }
/// <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)); }
/// <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); }
/**/ /// <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); } }
/// <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; }
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(); }