使用Path语法取得对象的值
借鉴了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语法取得对象的值的更多相关文章
- 更新AD对象属性值
1. 对于Set-ADUser不包含的对象属性,可以采用replace来操作 Set-ADUser -Identity 'UserA' -Replace @{userWorkstations = 'C ...
- EFCore使用JSON_VALUE查询json对象的值
EFCore使用JSON_VALUE查询json对象的值 Intro SqlServer 从2016开始支持 JSON 操作,可以使用 JSON_VALUE 查询 JSON 对象的某个属性值,更多介绍 ...
- django2笔记:路由path语法
django2笔记:路由path语法 9月23,Django 发布了2.0a1版本,这是一个 feature freeze 版本,如果没有什么意外的话,2.0正式版不会再增加新的功能了.按照以往的规律 ...
- 生成二维码 加密解密类 TABLE转换成实体、TABLE转换成实体集合(可转换成对象和值类型) COOKIE帮助类 数据类型转换 截取字符串 根据IP获取地点 生成随机字符 UNIX时间转换为DATETIME\DATETIME转换为UNIXTIME 是否包含中文 生成秘钥方式之一 计算某一年 某一周 的起始时间和结束时间
生成二维码 /// <summary>/// 生成二维码/// </summary>public static class QRcodeUtils{private static ...
- django2:路由path语法
目录 1.问题引入 2.使用示例 3.path转化器 4.自定义转化器 4.1 定义 4.2 注册 5.使用正则表达式 6.Import变动 7.代码改写 8.总结 9月23,Django 发布了2. ...
- js关于对象键值为数字型时输出的对象自动排序问题的解决方法
一.对象键值为数字型时输出的对象自动排序问题如: var objs = { "1603":{id:"1603"}, "1702" ...
- struts2 笔记01 登录、常用配置参数、Action访问Servlet API 和设置Action中对象的值、命名空间和乱码处理、Action中包含多个方法如何调用
Struts2登录 1. 需要注意:Struts2需要运行在JRE1.5及以上版本 2. 在web.xml配置文件中,配置StrutsPrepareAndExecuteFilter或FilterDis ...
- Struts2 用 s:if test 判断String类型的对象属性值和单字符是否相等的问题
Struts2 用 s:if test 判断String类型的对象属性值和单字符是否相等的问题 首先,这里所指的单字符形如:Y,男. 有两种做法: a. <s:if test='news.s ...
- 【freemaker】之自定义变量,特殊变量 globals ,循环对象取值
entity public class Employee { private Integer id; private String name; private Integer age; private ...
随机推荐
- leetcode 233 Number of Digit One
这题属于需要找规律的题.先想一下最简单的情形:N = 10^n - 1 记X[i]表示从1到10^i - 1中 1 的个数,则有如下递推公式:X[i] = 10 * X[i - 1] + 10^(i ...
- weblogic服务器的简单使用(一)
一.前言 现在的公司开发的项目基于的平台是weblogic8.1.5,虽然版本是旧了点,但是用到的功能还是很多的,如JNDI.t3协议.EJB2.0.线程池.连接池.Ant部署.java远程调试. 发 ...
- Java中线程的锁和数据库中的事务隔离级别
当涉及到两个或多个线程操作同一个资源时,就会出现锁的问题. 数据库中的某一条记录或者是某一个对象中的字段,可以修改,也可以读取,一般情况下,读取的那个方法应该加锁(即用synchronized互斥), ...
- swift系统学习控件篇:UIbutton+UIlabel+UITextField+UISwitch+UISlider
工作之余,学习下swift大法.把自己的学习过程分享一下.当中的布局很乱,就表在意这些细节了.直接上代码: UIButton+UILabel // // ViewController.swift // ...
- fn
var avalon = function (el) { return new avalon.init(el) } avalon.init = function (el) { this[0] = th ...
- 用Xshell访问 虚拟机里的kali
1.vim /etc/ssh/sshd_config 2.PermitRootLogin without-password复制 3.把一个PermitRootLogin without-passwor ...
- vcffilter 工具bug以及解决办法
1,使用说明: usage: vcffilter [options] <vcf file> options: -f, --info-filter specifies a filte ...
- editplus查找替换的正则表达式应用
表达式 说明\t 制表符.\n 新行.. 匹配任意字符.| 匹配表达式左边和右边的字符. 例如, "ab|bc" ...
- Eclipse 手机开发不能运行
ADB server didn't ACK问题 The connection to adb is down, and a severe error has occured. 1.先把eclipse关闭 ...
- 冒泡排序(python版)
实现源码 def bubble(array): flag = len(array)- : iter = for i in range(flag): ]: array[i], array[i+]= ar ...