我有一个从数据库中检索的对象XMLLog。表单允许用户编辑对象中的字段,但由于复杂的原因,我无法返回修改后的对象,我正在返回帖子中的键列表。
我想做以下事情:
//get XMLLog from the database
foreach (var key in Request.Form.AllKeys)
{
XMLLog.key = Request.Form[key];
}
//write XMLLog back to the Database
如果没有巨大的案例陈述来测试每个可能的密钥,有没有办法实现呢?
答案 0 :(得分:3)
你可以使用反射来做到这一点,但它会很慢。这是一个演示主体的小程序(你可以编译并运行它):
using System;
using System.Collections.Generic;
using System.Reflection;
class Program
{
static void Main(string[] args)
{
var log = new XmlLog();
var values = new Dictionary<string, string> { { "Hello", "1" }, { "World", "2" } };
foreach (var methodInfo in typeof(XmlLog).GetProperties(BindingFlags.Instance | BindingFlags.Public))
{
methodInfo.SetValue(log, values[methodInfo.Name]);
}
Console.WriteLine(log.Hello);
Console.WriteLine(log.World);
}
class XmlLog
{
public string Hello { get; set; }
public string World { get; set; }
}
}
使用代码生成可以更快地完成此操作。您有以下几种选择:
答案 1 :(得分:1)
反思就是如何做到这一点:
foreach (var key in Request.Form.AllKeys)
{
var prop = typeof(XMLLog).GetProperty(key);
prop.SetValue(myXmlLog, Request.Form[key], null);
}
这假设一个包含所有字符串的非常简单的结构 - 您可能需要添加验证,转换等,具体取决于XMLLog
类的数据类型和复杂性。
这也不是一个很好的解决方案。理想情况下,您可以让框架处理映射表单帖子到对象,就像使用MVC一样。如果你再描述一下你的环境,也许我们可以得到一个更好的答案。