从列表值替换类中的属性<Dictionary>值

  • 本文关键字:Dictionary 属性 列表 替换 c#
  • 更新时间 :
  • 英文 :


我有一个以List<Dictionary<string,object>>为参数的方法。我们的计划是使用该参数,但只更新特定类中保存的值。下面是(部分编写的)方法

public async Task<Errors> UpdatePageForProject(Guid projectId, List<Dictionary<string, object>> data)
{
if (!IsValidUserIdForProject(projectId))
return new Errors { ErrorMessage = "Project does not exist", Success = false };
if (data.Count == 0)
return new Errors { ErrorMessage = "No data passed to change", Success = false };
var page = await _context.FlowPages.FirstOrDefaultAsync(t => t.ProjectId == projectId);
foreach (var d in data)
{

}
return new Errors { Success = true };
}

我最初的计划是采取每个字典,检查是否键和属性在页面匹配,然后改变值(所以我可以在列表中传递1字典或8字典,然后改变页面保存回我的实体数据库)。

我宁愿不使用反射,由于速度打击(虽然c# 9真的很快,我仍然宁愿不使用它),但我不确定如何做到这一点。我确实考虑过使用AutoMapper来做这件事,但现在我宁愿不这样做(它是一个PoC,所以它可能是多余的)

如果您想在没有反射的情况下这样做(我同意这是一个好主意,不仅仅是出于性能原因),那么您可以使用"map"或查找表,每个属性的操作。

var map = new Dictionary<string,Action<Page,object>>()
{
{ "Title",   (p,o) => p.Title       = (string)o   },
{ "Header",  (p,o) => p.Field1      = (string)o   },
{ "DOB",     (p,o) => p.DateOfBirth = (DateTime)o }
};

然后可以遍历字典列表,并使用映射执行更新页面的操作。

foreach (var dictionary in data)
{
foreach (entry in dictionary)
{
var action = map[entry.Key];
action(page, entry.Value);
}
}

相关内容

最新更新