从文本填充对象

时间:2013-11-27 16:48:10

标签: c# .net

有没有办法在运行时从字符串填充对象的属性?任何可以帮助的图书馆? 举例来说,我有这个课程:

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"

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

2 个答案:

答案 0 :(得分:0)

我喜欢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);

答案 1 :(得分:-1)

考虑使用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; }
}