将任何 IEnumerable 分配给对象属性

2024-04-19

我有一个使用反射创建的对象列表,它们都是相同的类型,但是类型在编译时未知。

我想弄清楚best将此列表(也使用反射)分配给对象属性的方法可以是anyIE可数。

List<object>
ArrayList
Custom : List<object>

我唯一的方法是假设该属性是 ICollection,然后循环 IEnumerable 并添加每个项目。 (见下文,其中list是 IEnumerable 源,key是对象属性的字符串名称,result是物体本身)

foreach (object item in list) {
    PropertyInfo prop = result.GetType().GetProperty(key);
    var collection = prop.GetValue(result, null);

    Type collectionType = collection.GetType();
    MethodInfo add = collectionType.GetMethod("Add", BindingFlags.Public | BindingFlags.Instance);

    add.Invoke(collection, new object[] { item });
}

既然你说数据是同质的,我建议你尽可能地输入它;所以假设list是非空的,list[0].GetType()会告诉你Type所有数据。此时,你可以这样做:

IList typedList = (IList)Activator.CreateInstance(
           typeof(List<>).MakeGenericType(itemType));
...
foreach(var item in list) typedListAdd(item);

或者你可以使用数组:

Array arr = Array.CreateInstance(itemCount, list.Count);
list.CopyTo(arr, 0);

其中任何一个都会给你一个打字好list,对于大多数用途(数据绑定、序列化或只是反射)来说,它往往效果更好。

If list实际上不是一个list,但只是IEnumerable, 然后你可以基本上仍然做同样的事情,但只是将创建推迟到第一项:

IList typedList = null;
foreach(object item in list) {
    if(typedList == null) {
        typedList = (IList)Activator.CreateInstance(
           typeof(List<>).MakeGenericType(item.GetType()));
    }
    typedList.Add(item);
}
return typedList ?? new object[0];
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将任何 IEnumerable 分配给对象属性 的相关文章

随机推荐

  • Python CSV 编写器截断长数字

    我目前正在开发一个项目 该项目需要生成一个包含大量信息的 CSV 文件作为最终输出 目前 我将所有数据存储在一个非常大的列表中 然后使用 CSV 包将其写入 CSV 文件 我的问题是其中一个数据字段包含一个非常长的数字 存储为字符串 但第
  • Swift 栈和堆的理解

    我想快速了解堆栈和堆中存储的内容 我有一个粗略的估计 您打印的所有内容和内存地址都不是值 它们存储在堆栈中 而作为值打印出来的内容则在堆上 基本上根据值和引用类型 我完全错了吗 或者 您可以提供堆栈 堆的可视化表示吗 As Juul htt
  • 如何在 Firebase 实时数据库中保存本地数据?

    我对 Kotlin 和编程非常陌生 目前正在制作包含事件的日历 当我想将这些事件连接到 firebase 时 我的问题就出现了 我正在使用在 git 中找到的一个示例 https github com kizitonwose Calenda
  • 使用鼠标滚动 DataGridView

    因此 我们都熟悉单击并按住鼠标按钮 然后将鼠标移动到网格边缘 列 行滚动并且选择范围增加的功能 我有一个基于 DataGridView 的控件 由于性能问题 我必须关闭 MultiSelect 并自行处理选择过程 现在单击 按住滚动功能也被
  • 在matlab中对矩阵元素求和的有效(最快)方法

    让我们有矩阵A say A magic 100 我见过两种计算矩阵所有元素之和的方法A sumOfA sum sum A Or sumOfA sum A 其中一个比其他更快 或更好的练习 吗 如果有的话是哪一个 或者它们都同样快 看来你无法
  • 使用 PHPMailer 附加文​​件

    我有一个 HTML 表单 可以选择上传文件 然后 我想将该文件作为附件与其余表单数据一起发送到电子邮件地址 我正在使用 PHP Mailer 我获取要发送的表单数据 例如姓名 电话号码等 我无法将图像与它一起发送 我已经提供了迄今为止的代码
  • 如何在 Android 应用程序中播放和停止 mp3 文件

    我在 eclipse 中创建了一个应用程序来播放和停止 mp3 文件 一切都很好 除了当我播放音频文件并停止它并且我想重播它时 播放 btn 不起作用 我想知道是否有人可以帮助我 提前致谢 代码如下 package ir polyglotc
  • 更改 NUnit 测试的名称

    我希望我的单元测试基于NUnit在 Visual Studio 测试资源管理器中命名的框架更易于理解 例如 而不是有Test Case 1 or TestCase1我最好有类似的东西Test Case 1 Category First Ca
  • Android Room:应用与嵌入对象相关的多列

    在我的 Android 应用程序中 我使用 Room 进行数据存储 我目前面临的问题是 我需要在嵌入对象的 Relation 中放入 2 列 因为关系依赖于 2 列 结构见下图 Entity tableName damages public
  • 从通用平面获取轴对齐坐标

    标题可能是错误的 因为我不知道足够的数学知识来实际用一个小句子描述我的问题 我有一个 3D 矢量闭环 我将其称为 3D 多边形 我需要对其执行仅 2D 操作 这将返回一个 不同的 2D 点集 我需要将这些新的 2D 点转换回 3D 我目前的
  • 如何将下拉菜单置于父选项卡下居中?

    我有以下 CSS HTML 设置http jsfiddle net UDAUY http jsfiddle net UDAUY 如何对齐下拉菜单字段使其在父选项卡下居中 如下所示 MENU 1 MENU 2 MENU 3 MENU 4 Fi
  • 如何让 ko.compated 处理对象内的可观察值

    我有一个相当简单的视图模型来保存数据数组并获取一个我想用来过滤数据的字符串 我有一些非常简单的标记来渲染它 如下所示 section class task list ul li li ul section
  • 具有备用序列的列

    我想创建一个 user widgets 表 该表由 user id 和 user widget id 主键 其中 user widget id 的工作方式类似于序列号 除了每个用户从 1 个开始 对此有通用或实用的解决方案吗 我正在使用 P
  • networkx 通过属性搜索节点

    我寻找更优雅的方法来从以下属性之一搜索有向图中的节点 g nx DiGraph g add nodes from 1 dict d 0 a 7 2 dict d 0 a 6 g add nodes from 11 dict d 1 a 4
  • Android Studio - 非法字符 8204 错误

    由于某种原因 在重建我的项目后 我收到非法字符错误 但我的代码中没有任何内容以红色下划线显示 有人可以告诉我出了什么问题以及如何解决吗 Error illegal character 8204 WCBankActivity java imp
  • Linux 内核模块 Makefile 不能包含相对路径

    我正在尝试构建 Linux 内核模块 KBUILD EXTRA SYMBOLS Module symvers KBUILD EXTRA SYMBOLS dir0 Module symvers KDIR kernel linux 4 9 IN
  • Silverlight 中的计时器

    除了System Threading Timer对象之外 还有其他可以在Silverlight中使用的Timer对象吗 查看 DispatcherTimer http msdn microsoft com en us library sys
  • 在 SwiftUI 中正确使用 Task { }

    我想了解正确的用法Task 在以下 SwiftUI 代码中 我的目标是获得基本的了解以避免内存泄漏 这是 SwiftUI 部分的示例代码 struct MyView View ObservedObject var viewModel Vie
  • 当我从本机代码将非 nullptr 传递给 `alBufferData()` 时,OpenAL 应用程序崩溃/挂起

    我正在尝试使用 OpenAL 和 C C 在 Android 上播放一些声音 我正在使用 SDL 框架 我不断遇到神秘的崩溃alBufferData 即使我的代码很简单 ALuint buf src alGenBuffers 1 buf a
  • 将任何 IEnumerable 分配给对象属性

    我有一个使用反射创建的对象列表 它们都是相同的类型 但是类型在编译时未知 我想弄清楚best将此列表 也使用反射 分配给对象属性的方法可以是anyIE可数 List ArrayList Custom List 我唯一的方法是假设该属性是 I