在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
Attribute(特性) 此外,我们也可以自定义Attribute,来实现我们需要的功能。但自定义Attribute必须继承自Attribute类。Attribute中有很多方法或者属性,为我们提供了强大的功能。一般我们通过反射的方式来使用Attribute。 下面结合实际项目中的使用谈谈自己的体会。 [AttributeUsage(AttributeTargets.Property)] public class TableFieldAttribute : Attribute { /// <summary> /// 字段长度 /// </summary> public int Length { get; set; } /// <summary> /// 字段描述 /// </summary> public string Describe { get; set; } /// <summary> /// 字段类型 /// </summary> public string Type { get; set; } }
以上AttributeUsage,也是一个继承自Attribute的类,他的作用就是标志自定义类的使用范围,如:字段,属性,类,方法。以及使用我们自定义类 public class TableEntity { [TableField(Describe = "Guid主键", Length = 36, Type = "uniqueidentifier")] public Guid Guid { get; set; } [TableField(Describe = "名称", Length = 36, Type = "varchar ")] public string Name { get; set; } }
这样在实体定义上,我们就已经有了定义好了数据类型,长度等等。在实际要建临时表时,通过反射要建临时表的实体,便能构造相应的SQL命令了。 工具类的定义:public class Tools<T> where T : class。实际使用时,将泛型类型换成相应的类型即可。 public static List<Record> GetTableFieldsInformation() { Type t = typeof(T); PropertyInfo[] propertyInfos = t.GetProperties(); List<Record> tableEntities = new List<Record>(); propertyInfos.ToList().ForEach(property => { IList<CustomAttributeData> list = property.GetCustomAttributesData(); if (list.Count == 1) { tableEntities.Add(GetTableEntity(list[0].NamedArguments, property)); } else { throw new Exception(); } }); return tableEntities; }
recordEntities.ForEach(record => { if (i == 0) { sql = "CREATE TABLE [" + record.TableName + "]("; } if (list.All(item => !record.Type.Equals(item, StringComparison.OrdinalIgnoreCase))) { sql += string.Format("{0} {1}({2}),", record.FieldName, record.Type, record.Length); } else { sql += string.Format("{0} {1},", record.FieldName, record.Type); } i++; });
程序最终执行后如下图:
从图中标记的地方来看,是由于在AttributeUsage中属性的定义【 AttributeTargets ValidOn】以及构造函数的定义不一样导致的。 后记:特性的使用是很强大的一项功能。本例中使用的仅仅是其他很小的一部分。因此只对在实际应用中做了写说明。另:代码是没有经过细致整理 代码下载:https://files.cnblogs.com/tyb1222/Attributes.rar |
请发表评论