利用反射实现给多级类的属性赋值。

在写oba项目的时候,以前一直考虑的实体类中忽略了拥有子类的情况,该子类可能是很多类共用的。
例如:
class B {
        private int x;
        public int X {
            get { return x; }
            set { x = value; }
        }
    }
class A {
        private B _b;
        public B b {
            get { return _b; }
            set { _b = value; }
        }
    }
这种情况下:如果我得到一个A的实例a,(假定当获得a实例的时候b肯定不为null)我想给该实例的a.b.X利用反射进行赋值。实际编写如下:
static void SetValue(Object obj, string str, object value) {
            object temp = obj;
            object key = null;
            PropertyInfo values = null;
            string[] strs = str.Split('.');
            int length = strs.Length;
            if (length > 1) {
                for (int i = 0; i < length; i++) {
                    key = temp;
                    PropertyInfo propinfo = temp.GetType().GetProperty(strs[i]);
                    object o = temp.GetType().InvokeMember(strs[i], BindingFlags.GetProperty, null, temp, null);
                    if (o == null) {
                        return;
                    }
                    temp = o;
                    if (i == length - 2) {
                        values = propinfo;
                    }
                }
            }
            else {
            }
           values.SetValue(key, value, null);
        }
TestDriven:
static void Main(string[] args) {
            A a = new A();
            B b = new B();
            b.X = 1000;
            a.b = b;

            Type t = a.GetType();
            PropertyInfo propinfo=t.GetProperty("b");

            object o = t.InvokeMember("b", BindingFlags.GetProperty, null, a, null);

            if (o != null) {
                PropertyInfo propinfo2 = o.GetType().GetProperty("X");
                propinfo2.SetValue(o, 1000000, null);
                propinfo.SetValue(a, o, null);
            }
            SetValue(a, "b.X", 1233);
            Console.Write(a.b.X);
            Console.ReadLine();            
        }
最后得到该需求的通用写法。

转载于:https://www.cnblogs.com/Dorion/archive/2007/07/02/803413.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
EasyExcel 是一个基于 Java 的快速、便捷的 Excel 操作工具。它提供了简单易用的 API,可以帮助我们快速地实现 Excel 的读写操作。 在 EasyExcel 中,我们可以通过实体实现多级表头的写入。下面是一个示例代码: ``` // 定义实体 @Data public class DemoData { @ExcelProperty(value = { "第一级表头", "第二级表头1" }) private String field1; @ExcelProperty(value = { "第一级表头", "第二级表头2" }) private String field2; @ExcelProperty(value = { "第一级表头", "第二级表头3" }) private String field3; @ExcelProperty(value = { "第一级表头", "第二级表头4", "第三级表头1" }) private String field4; @ExcelProperty(value = { "第一级表头", "第二级表头4", "第三级表头2" }) private String field5; } // 写入 Excel 文件 public void writeExcel() { // 定义表头 List<List<String>> head = new ArrayList<>(); head.add(Arrays.asList("第一级表头")); head.add(Arrays.asList("第二级表头1")); head.add(Arrays.asList("第二级表头2")); head.add(Arrays.asList("第二级表头3")); head.add(Arrays.asList("第二级表头4", "第三级表头1")); head.add(Arrays.asList("第二级表头4", "第三级表头2")); // 定义数据 List<DemoData> dataList = new ArrayList<>(); for (int i = 0; i < 10; i++) { DemoData data = new DemoData(); data.setField1("field1-" + i); data.setField2("field2-" + i); data.setField3("field3-" + i); data.setField4("field4-" + i); data.setField5("field5-" + i); dataList.add(data); } // 写入 Excel 文件 EasyExcel.write("demo.xlsx", DemoData.class) .head(head) .sheet("Sheet1") .doWrite(dataList); } ``` 在这个示例代码中,我们首先定义了一个实体 `DemoData`,其中包含了不同级别的表头字段。然后,在写入 Excel 文件时,我们通过 `head` 参数指定了表头的层级关系,EasyExcel 会根据实体的注解来匹配表头字段,并生成相应的 Excel 文件。最后,我们将数据列表 `dataList` 写入 Excel 文件中。 通过这种方式,我们可以方便地实现多级表头的写入操作,并且无需手动处理表头的合并和格式等问题,大大提高了开发效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值