【发布时间】:2017-09-14 08:17:57
【问题描述】:
我有以下列表,其中包含字段名称和值。
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;} 等属性
【问题讨论】:
-
是的 Automapper 可以做到这一点,或者如果您想避免 Automapper 的开销,您可以通过将 FormField 的对象作为参数传递来手动映射 MyViewModel 的构造函数中的值。
-
@TechGirl 有什么代码可以帮忙吗?构造函数中的映射并不理想。
-
@TechGirl,真的吗?我非常怀疑。
-
您需要遍历集合,获取属性名称并使用条件语句(
if (FieldName == "Date") { model.Date = ...)设置关联的属性值,或者使用反射来匹配属性名称(使用PropertyInfo) -
我的想法与@StephenMuecke 相同,但您可以将 if 语句替换为“switch”,当然您可以在不同的函数中执行此操作,并在需要时调用它
标签: c# asp.net-mvc list serialization automapper