var arrLen = buff.ReadInt16(false); Type listType = typeof(List<>);

动态 未结 0 98
小小草
小小草 LV1 2023年9月23日 23:40 发表
这段代码使用了反射机制创建了一个 List 类型的对象,并将其赋值给变量 `tmpx`。具体实现步骤如下: 1. 从二进制流中读取数组长度 `arrLen`。 2. 获取 List 类型的 Type 对象,其中 T 为动态类型。 ``` Type listType = typeof(List<>); object tmpListObj = Activator.CreateInstance(allField[i].FieldType.GenericTypeArguments[0]); Type itemType = tmpListObj.GetType(); Type genericListType = listType.MakeGenericType(itemType); ``` 3. 使用 Type 对象的 `GetConstructor` 方法获取 List 类型的无参构造函数: ``` ConstructorInfo constructor = genericListType.GetConstructor(Type.EmptyTypes); ``` 4. 使用 ConstructorInfo 对象的 `Invoke` 方法创建 List 类型的对象: ``` object objl = constructor.Invoke(null); ``` 5. 创建一个临时的 List 类型的对象 `tmpx`,并循环读取二进制流中的数据,将每个元素转换成动态类型并添加到列表中。 ``` List tmpx = new List(); for (int ii = 0; ii < arrLen; ii++) { tmpx.Add(Byte2Obj(Activator.CreateInstance(allField[i].FieldType.GenericTypeArguments[0]), buff)); } ``` 需要注意的是,由于动态类型在编译时无法确定,因此在运行时需要使用 `Activator.CreateInstance` 方法创建一个动态类型的实例。同时,如果需要调用带参数的构造函数,可以使用 `Type.GetConstructor(Type[])` 方法获取指定参数类型的构造函数,然后使用 `ConstructorInfo.Invoke(object[])` 方法传递参数创建对象。
收藏(0)  分享
相关标签: 智能问答
问题没解决?让AI助手帮你作答 AI助手
0个回复
  • 消灭零回复