我有一个以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);
}
}