Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从文本填充对象_C#_.net - Fatal编程技术网

C# 从文本填充对象

C# 从文本填充对象,c#,.net,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 P

有没有办法在运行时从字符串填充对象的属性?有什么图书馆可以帮忙吗? 举例来说,我有一节课:

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"

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

我喜欢Newtonsoft Json库。我相信还有很多其他的图书馆可以提供这个功能,但这是我使用过并且很满意的一个

类的输出类似于:

        {
            "Property1":"Hello World",
            "Property2":42,
            "TestObject2":
            {
                "Property1":"Sub Hello World!"
            }
         }
执行此操作的代码只是Newtonsoft.Json.JsonConvert.SerializeObjecttest,返回对象的代码是:TestObject test2=Newtonsoft.Json.JsonConvert.DeserializeObjectjsonString

考虑使用CTP,尽管它仍然是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; }
}

您是否考虑过使用序列化/反序列化XML或JSON?您的文本文件格式是固定的还是允许您决定如何使用要用于填充对象的值?为什么不使用序列化?然而,如果您决定使用反射,我的例子就是如何实现反射-虽然代码是用于getter的,但setter将非常类似。每行文本表示一个类属性/子属性,如示例TestObject.Property2=5中所述,我从另一个应用程序收到它,因此无法更改格式。我根据文本格式创建了类。其目的是将此文本转换为对象,方便在我的系统中使用此数据。为什么要进行向下投票?它可以工作,解决了问题,并且比使用反射更干净。@bodee无法更改此格式,因此无法更改。