C# 使用变量名访问子对象

C# 使用变量名访问子对象,c#,forms,C#,Forms,我有一个从数据库中检索到的对象XMLLog。表单允许用户编辑对象中的字段,但由于复杂的原因,我无法返回修改过的对象,而是在帖子中返回键列表 我想做以下工作: //get XMLLog from the database foreach (var key in Request.Form.AllKeys) { XMLLog.key = Request.Form[key]; } //write XMLLog back to the Database 如果没有一个巨大的用例语句来测试每个可

我有一个从数据库中检索到的对象XMLLog。表单允许用户编辑对象中的字段,但由于复杂的原因,我无法返回修改过的对象,而是在帖子中返回键列表

我想做以下工作:

//get XMLLog from the database

foreach (var key in Request.Form.AllKeys)
{
    XMLLog.key = Request.Form[key];
}

//write XMLLog back to the Database

如果没有一个巨大的用例语句来测试每个可能的键,有什么方法可以做到这一点吗?

反射就是如何做到这一点的:

foreach (var key in Request.Form.AllKeys)
{
    var prop = typeof(XMLLog).GetProperty(key);
    prop.SetValue(myXmlLog, Request.Form[key], null);
}
这假设一个包含所有字符串的非常简单的结构-您可能需要添加验证、转换等,具体取决于
XMLLog
类的数据类型和复杂性


这也不是一个很好的解决方案。理想情况下,您应该让框架处理表单POST到对象的映射,就像使用MVC一样。如果您再多描述一下您的环境,也许我们可以得到一个更好的答案。

思考是您如何做到这一点的:

foreach (var key in Request.Form.AllKeys)
{
    var prop = typeof(XMLLog).GetProperty(key);
    prop.SetValue(myXmlLog, Request.Form[key], null);
}
这假设一个包含所有字符串的非常简单的结构-您可能需要添加验证、转换等,具体取决于
XMLLog
类的数据类型和复杂性


这也不是一个很好的解决方案。理想情况下,您应该让框架处理表单POST到对象的映射,就像使用MVC一样。如果你再多描述一下你的环境,也许我们可以得到一个更好的答案。

你可以使用反射来实现这一点,但它会非常慢。下面是一个演示原理的小程序(您可以编译并运行它):

使用系统;
使用System.Collections.Generic;
运用系统反思;
班级计划
{
静态void Main(字符串[]参数)
{
var log=new XmlLog();
var values=新字典{{“你好”,“1”},{“世界”,“2”};
foreach(typeof(XmlLog.GetProperties)(BindingFlags.Instance | BindingFlags.Public)中的var methodInfo)
{
methodInfo.SetValue(log,value[methodInfo.Name]);
}
Console.WriteLine(log.Hello);
Console.WriteLine(log.World);
}
类XmlLog
{
公共字符串Hello{get;set;}
公共字符串世界{get;set;}
}
}
这可以通过使用代码生成更快地完成。您有以下几种选择:

  • 在XmlLog类型上使用反射,并生成将随应用程序一起编译的C#代码
  • 使用反射构建一个设置XmlLog属性的表达式,然后在运行时将其编译为Func或Action

  • 您可以使用反射来实现这一点,但这将非常缓慢。下面是一个演示原理的小程序(您可以编译并运行它):

    使用系统;
    使用System.Collections.Generic;
    运用系统反思;
    班级计划
    {
    静态void Main(字符串[]参数)
    {
    var log=new XmlLog();
    var values=新字典{{“你好”,“1”},{“世界”,“2”};
    foreach(typeof(XmlLog.GetProperties)(BindingFlags.Instance | BindingFlags.Public)中的var methodInfo)
    {
    methodInfo.SetValue(log,value[methodInfo.Name]);
    }
    Console.WriteLine(log.Hello);
    Console.WriteLine(log.World);
    }
    类XmlLog
    {
    公共字符串Hello{get;set;}
    公共字符串世界{get;set;}
    }
    }
    
    这可以通过使用代码生成更快地完成。您有以下几种选择:

  • 在XmlLog类型上使用反射,并生成将随应用程序一起编译的C#代码
  • 使用反射构建一个设置XmlLog属性的表达式,然后在运行时将其编译为Func或Action

  • 我已经编辑了你的标题。请看,“,其中的共识是“不,他们不应该”。重复的我已经编辑了你的标题。请参阅“”,其中的共识是“不,他们不应该”。重复的我很想让它直接映射,但不幸的是,XMLLog对象的源作为直接的XML上传到数据库,最多有五层嵌套,并且任何元素都可能为空。我们试图创建一堆模型和编辑器模板,坦率地说,它比一个带有键的表单post的巨型case开关更容易混淆和出错:)我很想让它直接映射,但不幸的是,XMLLog对象的源以直接XML的形式上载到数据库,最多有五层嵌套,并且任何元素都可能为空。我们试图创建一堆模型和编辑器模板,坦率地说,这些模板比一个带有表单键的巨型case开关更容易混淆和出错:)