借鉴了http://stackoverflow.com/questions/4473928/c-sharp-dynamic-string-property-path

 

 

public class ReflectUtil
   {
       public static object ReflectOnPath(object o, string path)
       {
           object value = o;
           string[] pathComponents = path.Split('.');
           foreach (var component in pathComponents)
           {
               var x = component.Split(':');

               value = value.GetType().GetProperty(x[0]).GetValue(value, null);

               if (value.GetType().IsArray)
               {
                   int[] index = null;
                   if (x.Length > 1)
                       index = x.Skip(1).Take(int.MaxValue).Select(y => int.Parse(y)).ToArray();
                   if (index != null) value = ((Array)value).GetValue(index);
               }
           }
           return value;
       }
   }

 

 

 

Example:

[TestMethod]
       public void TestGetValue()
       {
           var o = new DistributeCfg
           {
               Configs = new[]
               {
                   new Config.Config
                   {
                       AppType = "v",
                       CallbackUrl = "fasdfasdf",
                       Key = "k",
                        NoticePostDataSetting = new PostDataSetting
                        {
                             Args = new Arg[]
                             {
                                  new Arg
                                  {
                                       Name = "name1",
                                       Value = "a.b.c"
                                  },
                                   new Arg
                                  {
                                       Name = "name2",
                                       Value = "a.b.c"
                                  }
                             }
                        },
                         PredictPostDataSetting  = new PostDataSetting
                        {
                             Args = new Arg[]
                             {
                                  new Arg
                                  {
                                       Name = "name1",
                                       Value = "Predict.b.c"
                                  },
                                  new Arg
                                  {
                                       Name = "name2",
                                       Value = "Predict.b.c"
                                  }
                             },
                              DeleteFlgSetting = new DeleteFlgSetting
                              {
                                   Audit = "1,2",
                                    Delete = "9",
                                     Pass = "10"
                              }
                        },
                   },
                     new Config.Config
                   {
                       AppType = "v",
                       CallbackUrl = "asdfasdfasdf",
                       Key = "k",
                        NoticePostDataSetting = new PostDataSetting
                        {
                             Args = new Arg[]
                             {
                                  new Arg
                                  {
                                       Name = "name1",
                                       Value = "a.b.c"
                                  },
                                   new Arg
                                  {
                                       Name = "name2",
                                       Value = "a.b.c"
                                  }
                             }
                        },
                         PredictPostDataSetting  = new PostDataSetting
                        {
                             Args = new Arg[]
                             {
                                  new Arg
                                  {
                                       Name = "name1",
                                       Value = "Predict.b.c"
                                  },
                                  new Arg
                                  {
                                       Name = "name2",
                                       Value = "Predict.b.c"
                                  }
                             },
                              DeleteFlgSetting = new DeleteFlgSetting
                              {
                                   Audit = "1,2",
                                    Delete = "9",
                                     Pass = "10"
                              }
                        },
                   }
               }
           };

           //var d = o.GetType().GetField("Configs").GetValue(o);

           string path = "Configs:0.PredictPostDataSetting.Args:0.Name";
           Console.WriteLine(ReflectUtil.ReflectOnPath(o, path));
           var p = o.GetType().GetProperty("Configs");
           //p.GetValue()
           //var array = o.GetType().GetProperty("Configs").GetType().IsArray;

           //var value = o.GetType().GetProperty("Configs").GetValue(o);

 

       }

       [TestMethod]
       public void TestValue()
       {
           var a = new A();
           a.Field = new B();
           a.Field.SubField = 10;

           string path = "Field.SubField";
           Console.WriteLine(ReflectUtil.ReflectOnPath(a, path));
       }

使用Path语法取得对象的值的更多相关文章

  1. 更新AD对象属性值

    1. 对于Set-ADUser不包含的对象属性,可以采用replace来操作 Set-ADUser -Identity 'UserA' -Replace @{userWorkstations = 'C ...

  2. EFCore使用JSON_VALUE查询json对象的值

    EFCore使用JSON_VALUE查询json对象的值 Intro SqlServer 从2016开始支持 JSON 操作,可以使用 JSON_VALUE 查询 JSON 对象的某个属性值,更多介绍 ...

  3. django2笔记:路由path语法

    django2笔记:路由path语法 9月23,Django 发布了2.0a1版本,这是一个 feature freeze 版本,如果没有什么意外的话,2.0正式版不会再增加新的功能了.按照以往的规律 ...

  4. 生成二维码 加密解密类 TABLE转换成实体、TABLE转换成实体集合(可转换成对象和值类型) COOKIE帮助类 数据类型转换 截取字符串 根据IP获取地点 生成随机字符 UNIX时间转换为DATETIME\DATETIME转换为UNIXTIME 是否包含中文 生成秘钥方式之一 计算某一年 某一周 的起始时间和结束时间

    生成二维码 /// <summary>/// 生成二维码/// </summary>public static class QRcodeUtils{private static ...

  5. django2:路由path语法

    目录 1.问题引入 2.使用示例 3.path转化器 4.自定义转化器 4.1 定义 4.2 注册 5.使用正则表达式 6.Import变动 7.代码改写 8.总结 9月23,Django 发布了2. ...

  6. js关于对象键值为数字型时输出的对象自动排序问题的解决方法

    一.对象键值为数字型时输出的对象自动排序问题如: var objs = {    "1603":{id:"1603"},    "1702" ...

  7. struts2 笔记01 登录、常用配置参数、Action访问Servlet API 和设置Action中对象的值、命名空间和乱码处理、Action中包含多个方法如何调用

    Struts2登录 1. 需要注意:Struts2需要运行在JRE1.5及以上版本 2. 在web.xml配置文件中,配置StrutsPrepareAndExecuteFilter或FilterDis ...

  8. Struts2 用 s:if test 判断String类型的对象属性值和单字符是否相等的问题

    Struts2 用 s:if test 判断String类型的对象属性值和单字符是否相等的问题   首先,这里所指的单字符形如:Y,男. 有两种做法: a. <s:if test='news.s ...

  9. 【freemaker】之自定义变量,特殊变量 globals ,循环对象取值

    entity public class Employee { private Integer id; private String name; private Integer age; private ...

随机推荐

  1. char, signed char, and unsigned char in C++

    关于这三者的区别stackoverrflow里有一个答案是这样说的: 3.9.1 Fundamental types [basic.fundamental] 1 Objects declared as ...

  2. Day1 summary

    对比了几篇在hadoop环境中实现关联规则.频繁项集的论文,文章结构都涉及mapreduce模型.传统与改进apriori算法比较.实验结果分析(数据规模-用时or加速比,节点-用时or加速比).有一 ...

  3. 玩转无线电 -- GPS Hacking (上)

    0x00 序 GPS Hacking 在过去几年的安全会议上一直都是很受关注的议题. 但往往因为内容太过学术化, 所需设备成本太高. 让许多感兴趣的朋友苦于无法入门. 直到GPS-SDR-SIM 这类 ...

  4. iOS常用设计模式:MVC、单例、代理、观察者。

    MVC 模型-视图-控制器(MVC)设计模式 MVC根据角色划分类,涉及到三个角色: Model:模型保存应用程序的数据. View:视图是模型的可视化表示以及用户交互的控件. Controller: ...

  5. HDU 4986

    http://acm.hdu.edu.cn/showproblem.php?pid=4986 题意:n个钥匙放在n个箱子里,每个钥匙和箱子一一对应,求打开所有箱子的期望 题解: 题意: 求随机排列的期 ...

  6. C,C++宏中#与##的讲解[转]

    MoreWindows 专注于Windows编程 C,C++宏中#与##的讲解 文中__FILE__与示例1可以参见<使用ANSI C and Microsoft C++中常用的预定义宏> ...

  7. 重学STM32---(九) ——CAN通信(一)

    一.CAN简介 1.CAN是什么? CAN 是 Controller Area Network的缩写(以下称为 CAN),是 ISO 国际标准化的串行通信协议. 2.CAN特点 (1)  多主控制 ( ...

  8. Howto add permanent static routes in Ubuntu

    Static routing is the term used to refer to the manual method used to set up routing. An administrat ...

  9. Ubuntu安装文泉驿-微米黑字体

    sudo apt-get install ttf-wqy-microhei #文泉驿-微米黑

  10. 面向过程部分 Java 和 C++ 的区别

    前言 Java 和 C++ 在面向过程部分区别并不大,但还是有的,本文罗列了这些区别. 在 Java 中: 1. 数据类型的范围和机器无关 2. 加上前缀 0b 可以表示二进制数,如 0b1001 就 ...