使用变量名访问子对象

本文关键字:对象 访问 变量名 | 更新日期: 2023-09-27 18:20:51

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

我想做以下事情:

//get XMLLog from the database
foreach (var key in Request.Form.AllKeys)
{
    XMLLog.key = Request.Form[key];
}
//write XMLLog back to the Database

如果没有一个巨大的案例陈述来测试每一个可能的密钥,有什么方法可以实现这一点吗?

使用变量名访问子对象

您可以使用反射来完成此操作,但速度会非常慢。下面是一个演示主体的小程序(您可以编译并运行它):

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. 对XmlLog类型使用反射,并生成将与应用程序一起编译的C#代码
  2. 使用反射生成一个设置XmlLog属性的表达式,然后在运行时将其编译为Func或Action

反射就是这样做的:

foreach (var key in Request.Form.AllKeys)
{
    var prop = typeof(XMLLog).GetProperty(key);
    prop.SetValue(myXmlLog, Request.Form[key], null);
}

这假设了一个包含所有字符串的非常简单的结构——根据XMLLog类的数据类型和复杂性,您可能需要添加验证、转换等。

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