.NET - 将列表转换/映射为对象,反之亦然

2023-12-27

我有以下包含字段名称和值的列表。

public class FormField 
{
    public string FieldName { get; set;}
    public string FieldValue { get; set;}
}

var formData = new List<FormField>();
formData.Add(new FormField { FieldName = "Date", FieldValue = "2017-09-14" });
formData.Add(new FormField { FieldName = "Name", FieldValue = "Job blogs" });
formData.Add(new FormField { FieldName = "IsEnabled", FieldValue = "true" });

如何将列表转换或映射到以下类?注意 FieldNames 映射到类的属性。

public class MyViewModel 
{
    [Required]
    public DateTime Date { get; set; } = DateTime.now;

    [Required]
    public string Name { get; set; }

    public boolean IsEnabled { get; set; }

    public IEnumerable<SelectListItem> Titles 
    {
        get
        {
            var options = new List<SelectListItem>
            {
                new SelectListItem(){ Value = "Mr", Text = "Mr" },
                new SelectListItem(){ Value = "Mrs", Text = "Mrs" }                    
            };

            return options;
        }
    } 
}

任何帮助表示赞赏。我需要以某种方式序列化列表吗?自动映射器可以做到这一点吗?

* 更新 *

我尝试了以下方法,但它不起作用,尽管自动映射器文档声明您可以直接从字典转到对象:

public class MappingProfile : Profile
{
    public MappingProfile()
    {
        CreateMap<Dictionary<string, object>, MyViewModel>();
    }
}

var viewModel = Mapper.Map<MyViewModel>(formData.ToDictionary(x => x.FieldName, x => (object) x.FieldValue))

注意:根据记录,我使用的是 automapper v 5.0.2

我还需要从对象返回到字典,但能够排除诸如public IEnumerable<SelectListItem> Titles {get;}


看起来您正在尝试创建一个包含动态数量字段的对象,例如 ViewBag。您不需要为此进行映射。 .NET 已通过 ExpandoObject、DynamicObject 类和dynamic关键词。

不要构建字段和值的列表,而是创建一个 ExpandoObject 并向其中添加字段,就像使用 ViewBag 一样:

dynamic formData=new ExpandoObject();
formData.Name = "Job blogs";
formData.Date = DateTime.Today;
formData.IsEnabled = true;
formData.Titles = new []{ 
                           new SelectedListeItem{Text="Mr",Value="Mr"},
                           new SelectedListeItem{Text="Mrs",Value="Mrs"}
                        };

您可以将该对象用作 ViewModel,就像 ViewBag 一样。

// Controller 

public ActionResult Index(..)
{
    ....
    View(formData);
}


//View 
@model dynamic 

<h1>@Model.Name</h1>

更新 - 从字段列表中展开

扩展对象 https://msdn.microsoft.com/en-us/library/system.dynamic.expandoobject(v=vs.110).aspx实施IDictionary<string, object>显式地,这意味着人们可以在运行时不知道其编号或名称的情况下进行属性,例如:

var fields = new (string name,object value) [] 
             {
                        ("Name","Job blogs"),
                        ("Date", DateTime.Today),
                        ("IsEnabled",true)
             };

dynamic viewModel=new ExpandoObject();
var dict=(IDictionary<string,object>)viewModel;
foreach(var field in fields)
{
    dict.Add(field.name,field.value);
}

我使用元组语法只是为了避免重复输入表单字段

更新 2 - 具有字典存储的强类型类

正如 Stephen Muecke 所评论的,使用动态类进行绑定和验证更加困难。另一方面,如果预先知道这些字段,为什么要使用映射或反射呢?

我们可以创建一个 ViewModel 类,它接受一些字段,将它们转换为字典(类似于 ExpandoObject 的做法),并使用字典作为属性的后备存储。

借助 CallMemberName 属性等 C# 魔法,额外的代码就很少了。那里is字典查找的运行时惩罚,只有在存在以下情况时才变得明显lot读/写次数:

class MyViewModel
{
    Dictionary<string,object> _dict=new Dictionary<string,object>();

    //Get helper
    private T getter<T>([CallerMemberName]string name=null)
    {
        return _dict.TryGetValue(name,out object value)
            ? (T)Convert.ChangeType(value,typeof(T))
            : default(T);            
    }

    private void setter(object value,[CallerMemberName]string name=null)
    {
        _dict[name]=value;
    }

    public DateTime Date { 
        get => getter<DateTime>();            
        set => setter(value); 
    }               
    public string Name { 
        get => getter<string>();            
        set => setter(value); 
    }
    public bool IsEnabled { 
        get => getter<bool>();            
        set => setter(value); 
    }

    public MyViewModel(IEnumerable<FormField> fields)
    {
        _dict=fields.ToDictionary(
                         field=>field.FieldName,
                         field=>(object)field.FieldValue);
    }

}

....

var formData = new [] {
    new FormField { FieldName = "Date", FieldValue = "2017-09-14" },
    new FormField { FieldName = "Name", FieldValue = "Job blogs" },
    new FormField { FieldName = "IsEnabled", FieldValue = "true" }
};

var myViewModel = new MyViewModel(formData);

每个属性的设置器仅使用属性名称作为键来设置字典值。吸气剂使用CallerMemberName获取属性的名称并将其用作密钥

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

.NET - 将列表转换/映射为对象,反之亦然 的相关文章

  • 如何读取扩展文件属性/文件元数据

    因此 我按照教程使用 ASP net core 将文件 上传 到本地路径 这是代码 public IActionResult About IList
  • 使用Physics.Raycast 和Physics2D.Raycast 检测对象上的点击

    我的场景中有一个空的游戏对象 带有 2D 组件盒碰撞器 我将脚本附加到该游戏对象 void OnMouseDown Debug Log clic 但是当我点击我的游戏对象时 没有任何效果 你有什么想法 如何检测我的盒子碰撞器上的点击 使用光
  • C++ 中本地类中的静态成员变量?

    我知道我们不能宣布static本地类中的成员变量 但其原因尚不清楚 那么请问有人可以解释一下吗 另外 为什么我们不能访问非static函数内部定义的变量 内部已经定义了局部类 直接在局部类成员函数中 在下面给出的代码中 int main i
  • Unix网络编程澄清

    我正在翻阅这本经典书籍Unix网络编程 https rads stackoverflow com amzn click com 0139498761 当我偶然发现这个程序时 第 6 8 节 第 179 180 页 include unp h
  • 向 Nhibernate 发出 SQL 查询

    如何将此 SQL 查询发送给 Nhibernate SELECT Customer name FROM Company INNER JOIN Customer ON Company CompanyId Customer CompanyId
  • JSON 语法:传输数组

    A validJSON 语法是这样的 username admin password 123 但是如果我想传输一组 用户 给出的例子 而不是单个 用户 根据规范 下面的代码是有效的 JSON 吗 username admin passwor
  • 将内置类型转换为向量

    我的 TcpClient 类接受vector
  • 读取文件特定行号的有效方法。 (奖励:Python 手册印刷错误)

    我有一个 100 GB 的文本文件 它是来自数据库的 BCP 转储 当我尝试导入它时BULK INSERT 我在第 219506324 行上收到一个神秘错误 在解决此问题之前 我想看看这一行 但可惜的是我最喜欢的方法 import line
  • 存储来自其他程序的事件

    我想将其他应用程序的事件存储在我自己的应用程序中 事件示例 打开 最小化 Word 或打开文件时 这样的事可能吗 运行程序 http msdn microsoft com en us library ms813609 aspx and 打开
  • 生成(非常)大的非重复整数序列而不进行预洗牌

    背景 我编写了一个简单的媒体客户端 服务器 我想生成一个不明显的时间值 随从客户端到服务器的每个命令一起发送 时间戳中将包含相当多的数据 纳秒分辨率 即使它不是真正准确 因为现代操作系统中计时器采样的限制 等 我想做的 在 Linux 上
  • PyCharm 无法识别字典值类型

    我有一个简单的代码片段 其中我将字典值设置为空列表 new dict for i in range 1 13 new dict i 现在 如果在下一行的循环内我会输入new dict i 并添加一个点 我希望 PyCharm 向我显示可用于
  • C# Dns.GetHostEntry 不返回连接到 WiFi 的移动设备的名称

    我有一个 C 中的 Windows 窗体应用程序 我试图获取列表中所有客户端的主机名 下面给出的是 ra00l 来自此链接的代码示例 GetHostEntry 非常慢 https stackoverflow com questions 99
  • 使用 JNI 从 Java 代码中检索 String 值的内存泄漏

    我使用 GetStringUTFChars 从使用 JNI 的 java 代码中检索字符串的值 并使用 ReleaseStringUTFChars 释放该字符串 当代码在 JRE 1 4 上运行时 不会出现内存泄漏 但如果相同的代码在 JR
  • PlaySound 可在 Visual Studio 中运行,但不能在独立 exe 中运行

    我正在尝试使用 Visual Studio 在 C 中播放 wav 文件 我将文件 my wav 放入项目目录中并使用代码 PlaySound TEXT my wav NULL SND FILENAME SND SYNC 我按下播放按钮 或
  • 等待线程完成

    private void button1 Click object sender EventArgs e for int i 0 i lt 15 i Thread nova new Thread Method nova Start list
  • std::async 与重载函数

    可能的重复 std bind 重载解析 https stackoverflow com questions 4159487 stdbind overload resolution 考虑以下 C 示例 class A public int f
  • .NET中的LinkedList是循环链表吗?

    我需要一个循环链表 所以我想知道是否LinkedList是循环链表吗 每当您想要移动列表中的 下一个 块时 以循环方式使用它的快速解决方案 current current Next current List First 电流在哪里Linke
  • C++ 密码屏蔽

    我正在编写一个代码来接收密码输入 下面是我的代码 程序运行良好 但问题是除了数字和字母字符之外的其他键也被读取 例如删除 插入等 我知道如何避免它吗 特q string pw char c while c 13 Loop until Ent
  • 英特尔 Pin 与 C++14

    问题 我有一些关于在 C 14 或其他 C 版本中使用英特尔 Pin 的问题 使用较新版本从较旧的 C 编译代码很少会出现任何问题 但由于 Intel Pin 是操作指令级别的 如果我使用 C 11 或 C 14 编译它 是否会出现任何不良
  • 防止在工厂方法之外实例化对象

    假设我有一个带有工厂方法的类 class A public static A newA Some code logging return new A 是否可以使用 a 来阻止此类对象的实例化new 那么工厂方法是创建对象实例的唯一方法吗 当

随机推荐

  • Wordpress 登录页面重定向到普通用户的 Woocommerce 我的帐户页面

    我陷入了深深的麻烦之中 请帮我找到以下问题的解决方案 我有一个使用 Woocommerce 插件的 WordPress 网站 通常 Woocommerce 不允许普通用户 客户 用户 您可以从 Wordpress 管理区域 gt 添加新用户
  • 参数返回 SQL0418 的 iDB2 Select 命令

    我正在开发一个使用 IBM Data DB2 iSeries dll 连接到 DB2 iSeries 7 1 数据库的 NET 应用程序 我需要执行一个 SELECT 命令 该命令有 n 个参数 这些参数在查询中定义为 paramX 然后设
  • 将通配符传递给别名

    我使用修改列表命令作为别名 在 KSH 中 alias ltf ls lrt d 1 PWD 所以命令ltf显示类似这样的内容 rw r r 1 myuser mygroup 0 Apr 18 12 00 usr test txt rw r
  • 用C#编写0-1背包的模拟退火算法

    我正在学习模拟退火算法 并且有一些关于如何修改示例算法来解决 0 1 背包问题的问题 我在CP上发现了这段很棒的代码 http www codeproject com KB recipes simulatedAnnealingTSP asp
  • Google Cloud SQL 的典型 ormconfig.json 文件?

    我已经尝试了几个小时了 Google Cloud SQL 与 TypeORM 配合使用的 ormconfig json 文件应该是什么 我设法让它在本地使用数据库的IP 使用mysql工作台和Google云代理并将我的IP列入白名单 但我不
  • 如何等到跟踪脚本触发后再重定向用户?

    我运行一个典型的价格比较网站 用户浏览产品 然后单击链接转到商家的网站 在被重定向到商家的网站之前 用户会看到一个 我们正在重定向您 页面 此页面仅允许跟踪代码 Google Analytics Adwords Bing Ads 来跟踪事件
  • FirebaseRecyclerAdapter 具有用于删除项目的操作模式

    我正在尝试实现一个操作模式来删除 FirebaseRecyclerView 中的项目 奇怪的是 有时删除的项目并不是选定的项目 我认为错误出现在 ToogleSelection 方法或 RemoveItems 方法中 但我不知道它是什么 适
  • PyCharm 在同一文件夹中找不到导入

    我正在使用 PyCharm 并且从同一目录中的另一个 python 文件导入一些常量 导入在运行时起作用 但我在导入语句上以及每次使用文件中的常量时都会得到这个恼人的红色下划线 这是文件层次结构 请忽略文件夹上的红色下划线 它们与此无关 是
  • FileSystemWatcher 网络断开

    我有一个 FileSystemWatcher 监视网络共享上的文件 如果发生导致共享不可用的事件 可能是由于网络问题 FileSystemWatcher 将断开连接 显然我可以处理 错误 事件 也许可以做一些日志记录 并且很多文章建议在错误
  • Matplotlib,使用 imshow 刷新图像更快

    我正在开发一个项目 在该项目上 我必须在 GUI 窗口上绘制 320 250 像素的图像 如果可能的话 每秒绘制 60 次 所以我尝试这样做matplotlib 2 0 2 Python 3 6 and PyQt5 因为我开始了解这些工具并
  • 如果是嵌套元素,则后代 Until()

    在我之前的问题中 link https stackoverflow com questions 75957548 xdocument descendants cannot distinguish between parent child e
  • 如何将 Asp.Net Server 标签添加到 JS 并对其进行评估?

    我有一个 javascript 文件 我动态地将其包含到 ASP NET MVC 视图中 该脚本设置了一些我想从中获取其值的 javascript 变量和 HTML 帮助程序 以下将 js 变量设置为等于包含 var testPortal
  • Kivy:触摸标签以选中复选框

    我正在尝试为 MCQ 制作一个 aap 这里我想要一个功能 如果有人点击与复选框相对应的标签 则该复选框也必须被选中 在Kivy中可以吗 因为 Kivy 不直接提供任何与复选框的文本关联 这是 kv 的一部分
  • 我们如何使用 startActivityforResult() 来发送电子邮件意图?

    我正在使用意图发送带有附件的电子邮件 工作正常 我想获得此电子邮件意图结果 我已经使用过startActivityforResult 但我无法获得电子邮件意图的结果 我们如何使用startActivityforResult 电子邮件意图 谢
  • 在 REST API 中使用 LINK 和 UNLINK HTTP 动词

    我目前正在致力于实现 REST API 我有一个资源模型 其中各个资源之间存在大量关系 我的问题是 如何以 RESTful 方式将两个现有资源相互链接 建立关系 我遇到的一种解决方案是使用 LINK 和 UNLINK HTTP 动词 API
  • Perl 6 的多重调度如何决定使用哪个例程?

    考虑这个程序 我在参数列表中构造了一个数组 尽管有一个接受数组的签名 但这调用了接受列表的签名 foo 1 2 3 multi foo Array array put Called Array version multi foo Array
  • 如何在 iOS10 (Swift 3) 中获取“正在播放”歌曲的歌词

    我想显示 iOS 系统播放器当前正在播放的歌曲的歌词 这是我的自定义播放器 import UIKit import MediaPlayer import AVFoundation class NowPlayingController NSO
  • 有没有办法知道Python中的Unicode字符串是否包含任何中文/日文字符?

    我在 Python 中有一个 Unicode 字符串 我正在寻找一种方法来确定字符串中是否有中文 日文字符 如果可能的话 最好能够找到这些字符 看起来这与语言检测问题有点不同 我的字符串可以是英文和中文文本的混合 我的代码可以访问互联网 您
  • Laravel 控制器中的 foreach 循环

    我在控制器 laravel 4 中循环数据时遇到问题 我的代码是这样的 owner Input get owner count Input get count product Product whereOwnerAndStatus owne
  • .NET - 将列表转换/映射为对象,反之亦然

    我有以下包含字段名称和值的列表 public class FormField public string FieldName get set public string FieldValue get set var formData new