【问题标题】:use variable name to access sub object使用变量名访问子对象
【发布时间】:2013-07-03 23:05:34
【问题描述】:

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

我想做以下事情:

//get XMLLog from the database

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

//write XMLLog back to the Database

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

【问题讨论】:

标签: c# forms


【解决方案1】:

您可以使用反射来做到这一点,但它会很慢。下面是一个演示主体的小程序(可以编译运行):

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。

【讨论】:

    【解决方案2】:

    反思就是你这样做的方式:

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

    这假定一个包含所有字符串的非常简单的结构 - 您可能需要添加验证、转换等,具体取决于您的 XMLLog 类的数据类型和复杂性。

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

    【讨论】:

    • 我很想直接映射它,但不幸的是,XMLLog 对象的源作为直接 XML 上传到数据库,最多嵌套五层,并且任何元素都可能为空。我们尝试创建一堆模型和编辑器模板,坦率地说,这比带有键的表单帖子的巨大案例切换更令人困惑和容易出错:)
    猜你喜欢
    • 2012-05-15
    • 1970-01-01
    • 1970-01-01
    • 2012-04-02
    • 1970-01-01
    • 2021-05-05
    • 2016-12-27
    • 2015-07-09
    • 2011-06-10
    相关资源
    最近更新 更多