之前在开发一个程序,希望能够通过属性名称读取出属性值,但是由于那时候不熟悉反射,所以并没有找到合适的方法,做了不少的重复性工作啊!
然后今天我再上网找了找,被我找到了,跟大家分享一下。
其实原理并不复杂,就是通过反射利用属性名称去获取属性值,以前对反射不熟悉,所以没想到啊~
不得不说反射是一种很强大的技术。。
一、反射
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- namespace GetValue
- {
- class Program
- {
- static void Main(string[] args)
- {
- Person ps = new Person();
- ps.Name = "CTZ";
- ps.Age = 21;
- Console.WriteLine(ps.GetValue("Name"));
- Console.WriteLine(ps.GetValue("Age"));
- }
- }
- class Person
- {
- public string Name
- { get; set; }
- public int Age
- { get; set; }
- public object GetValue(string propertyName)
- {
- return this.GetType().GetProperty(propertyName).GetValue(this, null);
- }
- }
- }
实质语句只有一句:
this.GetType().GetProperty(propertyName).GetValue(this, null);
其他可以忽略。。
Object.GetType().GetProperty().GetValue()
不能直接读取Json转化对象 JsonConvert.DeserializeObject(JsonStr),必须有对应类型JsonConvert.DeserializeObject<>(JsonStr),所以无意义
二、获取Json对象
List<string> list = new List<string>(); string json = JsonConvert.SerializeObject(new { Name = "jeff", Age = 23, Code = "f04536a3-832c-4ebd-95d0-15af82dbb1a2", PhoneNumber = "15902104019" }); // 第一种 IDictionary<string, JToken> data = JsonConvert.DeserializeObject<JObject>(json); foreach (var i in data) { string key = i.Key; var value = i.Value; if (value.Type.ToString() == "String") { list.Add(value.ToString()); } } //第二种 推荐 var result = JsonConvert.DeserializeObject<IDictionary<string, object>>(json); var name = result["Name"]; var age = result["Age"]; foreach (var p in result.Keys) { var value = result[p]; } int j = 0; foreach (var p in result) { var key = p.Key; var value = p.Value; var type = p.Value.GetType(); if (type == typeof(string)) { j += 1; } } // 第三种 clsTest obj = JsonConvert.DeserializeObject<clsTest>(json); var name1 = obj.GetType().GetProperty("Name"); foreach (var p in obj.GetType().GetProperties()) { var type = p.GetType().Name; var key = p.Name; var value = p.GetValue(obj); }