做项目的过程中需要动态为自定义强类型的属性赋值,但是有的属性是List,反射回来得到的对象怎么使用index呢?

参考 https://blog.csdn.net/chy_xfn/article/details/82421255

利用Property的“Count”和"Item"属性可以分别获取下标和对应的对象。

// 需要引用的命名空间
using System.Reflection;
using System;
public class Test
    public Person person = new Person();
    public Test()
        person.country = "china";
        Man man = new Man();
        man.name = "张三";
        man.sex = "男";
        person.manList = new List<Man>();
        person.manList.Add(man);
        PrintMessage<Person>(person);
    public static string PrintMessage<T>(T t)
         printMsg.Clear();
         printMsg.Append("\n"+t.ToString()+"\n{\n");
         PrintInternal(t);
         printMsg.Append("}\n");
         return printMsg.ToString();
     // 传入需要查询的数据结构体,通过反射打印其所有公共属性
     private static void PrintInternal<T>(T t, string intervalStr = "")
         // 通过泛型类T实例的Type获取所有公共属性
         PropertyInfo[] infos = t.GetType().GetProperties();
         foreach (PropertyInfo info in infos)
             if (info != null)
                 // 判断属性类型是否为泛型类型,如:
                 // typeof(int).IsGenericType --> False
                 // typeof(List<int>).IsGenericType --> True
                 // typeof(Dictionary<int>).IsGenericType --> True
                 if (info.PropertyType.IsGenericType)
                     // 如List<Man>,返回类名Man
                     string className = info.PropertyType.GetGenericArguments()[0].Name;
                     printMsg.Append("  " + info.Name + ":\n");
                     // 获取该泛型属性值,返回一个列表,如List<Man>;
                     // 因为是反射返回的数据,无法直接转换为List使用,针对这种数据,反射机制对这种属性值提供了
                     // “Count”列表长度、“Item”子元素等属性;
                     object subObj = info.GetValue(t, null);
                     if (subObj != null)
                         // 获取列表List<Man>长度
                         int count=Convert.ToInt32(subObj.GetType().GetProperty("Count").GetValue(subObj,null));
                         for (int i = 0; i < count; i++)
                             printMsg.Append(intervalStr +"  {\n");
                             // 获取列表子元素Man,然后子元素Man其实也是一个类,然后递归调用当前方法获取类Man的所有公共属性
                             object item=subObj.GetType().GetProperty("Item").GetValue(subObj,new object[]{i});
                             PrintInternal(item, "  ");
                             printMsg.Append(intervalStr + "  },\n");
                   else {
                       // 属性info,通过info.Name获取属性字段名,通过info.GetValue(t, null)获取值(返回obje类型需要自己转换)
                       printMsg.Append(intervalStr+"  "+info.Name +":"+info.GetValue(t, null).ToString()+"\n");
public class Person{
    public string country;
    public List<Man> manList = new List<Man>();
public class Man{
    public string name;
    public string sex;
                    做项目的过程中需要动态为自定义强类型的属性赋值,但是有的属性是List,反射回来得到的对象怎么使用index呢?参考https://blog.csdn.net/chy_xfn/article/details/82421255利用Property的“Count”和"Item"属性可以分别获取下标和对应的对象。// 需要引用的命名空间using System.Reflection;u...
				
首先看一下泛型的基本语法 访问修饰符 返回型 泛型方法名 <T>(T 参数)1):无法在泛型方法内部给任何 T 型创建实例的对象,因为在泛型方法内部不知道传进来的对象有哪些构造函数2):约束是对内部的!(对于泛型方法)约束也是会被继承的!3):给泛型类型(引用型,型)的约束:where T:class,new ( )遇到的问题:在写MongodbHelper的时候,为了能处理多种别,所以如下定义了该: 代码如下: public class MongodbHelper<T> {  。。。。。  }在该的实现中有如下操作: 代码如下:mongo.Connect();
本文以实例形式讲述了C#通过反射创建自定义泛型的实现方法,分享给大家供大家参考。具体如下: 比如有这样一个泛型:Demo.GenericsSimple<T> 我想要通过反射创建一个Demo.GenericsSimple<string>的实例可以通过下面的格式进行创建: System.Reflection.Assembly.GetExecutingAssembly().CreateInstance(命名空间.User`形参数量N[[1形参型全名,形参型所在的程 序集名称],[2形参型全名,形参型所在的程序集名称],[3形参型全名,形参型所在的程序集名称]......
很久很久以前,有个需求是客户端需要将从服务器收到的数据结构体(通常是个自定义协议)的详细日志打印出来。因为是准备写个通用方法,故是不能知道是具体哪个、这个里面有哪些属性的;所以我们无法直接将其转换为具体某个来处理。这时就可以用反射机制获取这个的所有公共属性了。 关于反射api用法可以直接看官方文档,或者看我下面给出的代码;而今天写这篇文章的重点主要是如何输出内嵌List&lt;T&g...
C#基础_型转换隐式(implicit)型转换不丢失精度的转换子向父的转换装箱显式(explicit)型转换有可能丢失精度(甚至发生错误)的转换 cast拆箱使用ConvertToString方法与各数据型的Parse / TryParse方法自定义型转换操作符 隐式(implicit)型转换 代码中不用明确告诉编译器,你要将一种型转换成另一种型,编译器会自动帮我们将这个型进行转换这种转换叫做隐式型转换 不丢失精度的转换 long型在内存当中是用八个字节64位储存他的数
代码一:父子关系,父实体赋给子实体 public static TChild AutoCopy<TParent, TChild>(TParent parent) where TChild : TParent, new() TChild child = new TChild(); var ParentType = typeof(TParent); var P...
var typeList = typeof(List<>); Type typeDataList = typeList.MakeGenericType(datatypeTarget.DataObjectType); var vtData = typeDataList.InvokeMember(null, ...