通过备注(Attribute)为实例赋值。
今天遇到一些小问题,在使用正则表达式分析如下HTML代码
< td >姓名</ td >< td >王五</ td > < td >年龄</ td >< td >22</ td > < td >性别</ td >< td >男</ td > |
发现提取出来的内容全是配对的,并且是字符串。
姓名 王五 年龄 22 性别 男 |
有个实体类
class people { string name; int aeg; int sex; } |
现在问题来了,我们应该如何赋值呢?如果每次循环,那样效率太低了,不然怎么才能找通过中文找到对应的属性呢?
经过半个小时的研究,从EnumRemarkHelper中找到启发。可以通过发射+特性的方式找到对应的属性,并为其赋值。
public class FieldRemark : Attribute { /// <summary> /// 构造函数 /// </summary> /// <param name="remark"></param> public FieldRemark( string remark) { _remark = remark; } private string _remark; /// <summary> /// 备注 /// </summary> public string Remark { get { return _remark; } set { _remark = value; } } private static Dictionary<Type, Dictionary< string , FieldInfo>> dictionary = new Dictionary<Type, Dictionary< string , FieldInfo>>(); public static Dictionary<Type, Dictionary< string , FieldInfo>> FieldRemarkDictionary { get { return FieldRemark.dictionary; } } public static void GetFieldRemarks( object obj) { Type type = obj.GetType(); FieldInfo[] v = type.GetFields(); Dictionary< string , FieldInfo> temp = new Dictionary< string , FieldInfo>(); foreach (FieldInfo v1 in v) { object [] CustomAttributes = v1.GetCustomAttributes( typeof (FieldRemark), false ); if (CustomAttributes != null && CustomAttributes.Count() > 0) { if (!temp.ContainsKey(((FieldRemark)CustomAttributes[0]).Remark)) { temp.Add(((FieldRemark)CustomAttributes[0]).Remark, v1); } } } if (temp.Count > 0) { dictionary.Add(obj.GetType(), temp); } } } public class FieldRemarkHelper { public static void SetValue( object obj, string attribute, object value) { //如果缓存里面没有内容则加载 if (FieldRemark.FieldRemarkDictionary.Count <= 0) { FieldRemark.GetFieldRemarks(obj); } //如果没有这个类型,则初始化。 if (!FieldRemark.FieldRemarkDictionary.ContainsKey(obj.GetType())) { FieldRemark.GetFieldRemarks(obj); } if (FieldRemark.FieldRemarkDictionary.ContainsKey(obj.GetType())) { Dictionary< string , FieldInfo> temp = FieldRemark.FieldRemarkDictionary[obj.GetType()]; if (temp.ContainsKey(attribute)) { MethodInfo mi=temp[attribute].FieldType.GetMethod( "Parse" , new Type[] { value.GetType()}); if (mi != null ) { temp[attribute].SetValue(obj, mi.Invoke(temp[attribute], new object [] { value })); } else { temp[attribute].SetValue(obj, value ); } } else { throw new Exception( string .Format( "程序出现错误,{0}不存在备注为{1}的属性,无法赋值" , obj.GetType().Name, attribute)); } } else { throw new Exception( string .Format( "{0}类中并不存在带有备注的属性" , obj.GetType().Name)); } } } |
使用起来就很方便了。
public class People { [FieldRemark( "姓名" )] public string name; [FieldRemark( "性别" )] public int sex; [FieldRemark( "性别" )] public int age; } |
People peo = new People(); FieldRemarkHelper.SetValue(peo, "姓名" , "王五" ); FieldRemarkHelper.SetValue(peo, "性别" , 0); FieldRemarkHelper.SetValue(peo, "年龄" , 1); |
另:如果代码有问题,请大家指出,谢谢。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步