【问题标题】:Populate object from text从文本填充对象
【发布时间】:2013-11-27 16:48:10
【问题描述】:

有没有办法在运行时从字符串中填充对象的属性?任何可以提供帮助的图书馆? 例如,我有这个类:

public class TestObject
{
    public string Property1 { get; set; }
    public int Property2 { get; set; }
    public TestObject2 TestObject2 { get; set; }
}
public class TestObject2
{
    public string Property1 { get; set; }
}

在我的真实案例中,该类还有其他几个子类、数组和其他数据类型。 我需要从文本、文件、列表中填充属性,内容如下:

TestObject.Property1 = "String Value"
TestObject.Property2 = 5
TestObject.TestObject2.Property1 = "Sub Property String"

我看到的一种可能性是扫描文本并使用反射分配值/对象。但在我寻找已经存在的东西之前。

【问题讨论】:

  • 您是否考虑过使用序列化/反序列化(XML 或 JSON)?
  • 您的文本文件格式是固定的还是允许您决定要如何使用值来填充对象?
  • 为什么不想使用序列化?但是,如果您决定使用反射,this question 中有我的示例,它是如何完成的 - 尽管代码是针对 getter 的,但 setter 将非常相似。
  • 每一行文本代表一个类属性/子属性,如示例中所述(“TestObject.Property2 = 5”),我从另一个应用程序接收它,所以我无法更改格式。我根据文本格式创建了类。我们的想法是将此文本转换为对象,以便在我的系统中使用此数据。

标签: c# .net


【解决方案1】:

我喜欢 Newtonsoft Json 库 (http://james.newtonking.com/json)。我敢肯定还有很多其他的库可以解决这个问题,但这是我使用过并且很满意的一个。

你的类的输出看起来像:

        {
            "Property1":"Hello World",
            "Property2":42,
            "TestObject2":
            {
                "Property1":"Sub Hello World!"
            }
         }

执行此操作的代码只是Newtonsoft.Json.JsonConvert.SerializeObject(test),返回对象的代码是:TestObject test2 = Newtonsoft.Json.JsonConvert.DeserializeObject<TestObject>(jsonString);

【讨论】:

    【解决方案2】:

    考虑使用Roslyn(虽然还是CTP),在这里可以轻松搞定:

    var testObject = new TestObject();
    testObject.Property1 = "Value1";
    testObject.Property2 = 44;
    testObject.TestObject2 = new TestObject2();
    testObject.TestObject2.Property1 = "NestedValue1";
    
    var scriptEngine = new ScriptEngine();
    scriptEngine.AddReference(typeof(TestObject).Assembly);
    var session = scriptEngine.CreateSession(new HostObject() { TestObject = testObject });
    session.Execute("TestObject.Property1 = \"Value2\"");
    session.Execute("TestObject.TestObject2.Property1 = \"Sub Property String\"");
    
    var test1 = testObject.Property1 == "Value2"; // true
    var test2 = testObject.TestObject2.Property1 == "Sub Property String"; // true
    

    有一个小助手类:

    public class HostObject
    {
        public TestObject TestObject { get; set; }
    }
    

    【讨论】:

    • 为什么要投反对票?它有效,解决了问题并且比使用反射更干净。而且@bodee不能改变这种格式,所以没办法。
    猜你喜欢
    • 1970-01-01
    • 2019-08-20
    • 1970-01-01
    • 1970-01-01
    • 2019-02-28
    • 2019-10-04
    • 2020-07-26
    • 1970-01-01
    相关资源
    最近更新 更多