zoukankan      html  css  js  c++  java
  • 通过备注(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);
    

    另:如果代码有问题,请大家指出,谢谢。

  • 相关阅读:
    如何使用maven进行avro序列化
    CDH搭建和集成spark、kafka操作
    spark批量写写数据到Hbase中(bulkload方式)
    Hbase服务报错:splitting is non empty': Directory is not empty
    关于java中的伪共享的认识和解决
    一次流式处理的submit
    Hbase的写入负载均衡
    基于bs4库的HTML标签遍历方法
    BeautifulSoup库的基本元素
    Requests的基本使用
  • 原文地址:https://www.cnblogs.com/comsokey/p/2136338.html
Copyright © 2011-2022 走看看