如何从文件中填充类成员

时间:2016-05-29 16:31:17

标签: c# deserialization

我想用文件中的值填充类成员 我正在创建此文件,因此我可以根据需要选择格式。我认为这应该是这样容易阅读:

name,value
name,value
etc.

我和“Car.a”,“Car.b”等成员上课“Car” 例如:

a,5

它应该给我

Car.a = 5;

如何实现这一目标?

3 个答案:

答案 0 :(得分:1)

您可以使用Reflection来执行此操作。与XmlSerializer的作用类似:

  • 解析属性名称和值
  • 确定属性的类型
  • 将字符串值转换为您的媒体资源
  • 指定值

此示例适用于大多数基本数据类型:

private void AssignProperty(object obj, string propertyName, string propertyValue)
{
    PropertyInfo property = obj.GetType().GetProperty(propertyName);
    property.SetValue(obj, Convert.ChangeType(propertyValue, property.PropertyType), null);
}

See it in action on dotNetFiddle

如果您需要更频繁地使用此格式,您当然可以构建自己的Deserializer

public class StringLinesDeserializer<T> where T : new()
{
    public T Deserialize(string[] assignments)
    {
        T result = new T();

        foreach (string assignment in assignments)
        {
            int commaPos = assignment.IndexOf(',');
            string propertyName = assignment.Substring(0, commaPos);
            string propertyValue = assignment.Substring(commaPos + 1);

            AssignProperty(result, propertyName, propertyValue);
        }

        return result;
    }

    private void AssignProperty(object obj, string propertyName, string propertyValue)
    {
        PropertyInfo property = obj.GetType().GetProperty(propertyName);
        property.SetValue(obj, Convert.ChangeType(propertyValue, property.PropertyType), null);
    }
}

可以像这样使用:

string[] assignments = new string[]{"a,5","b,6"};
StringLinesDeserializer<Car> deserializer = new StringLinesDeserializer<Car>();
Car newCar = deserializer.Deserialize(assignments);

答案 1 :(得分:0)

由于您已开放其他方式,我建议您使用Json.Net之类的内容来序列化/反序列化您的对象。这是一个简短的例子:

Car car = new Car { a = 10, name = "Golf" };
var str = JsonConvert.SerializeObject(car);

str将包含json格式的Car对象的序列化版本,如下所示:

{"a":10,"name":"Golf"}

如果你想从那个JSON字符串重新创建你的对象,那么使用它:

Car deserializedCar = JsonConvert.DeserializeObject<Car>(str);

Demo

如果您更喜欢使用XML:

var car = new Car { name = "Hellcat", a = 10 };
var serializer = new System.Xml.Serialization.XmlSerializer(typeof(Car));
string carXml = null;
using (var ms = new System.IO.MemoryStream())
{
    serializer.Serialize(ms, car);
    carXml = System.Text.Encoding.UTF8.GetString(ms.ToArray());
}

carXml将包含以下内容:

<?xml version="1.0"?>
<Car xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <a>10</a>
  <name>Hellcat</name>
</Car>

答案 2 :(得分:0)

通过关注文本文件内容:

  

A,20个
  B,14

如果您将public class Car { public object a { get; set; } public object b { get; set; } } 类定义如下:

private Car GetCarFromFile(string strFilePath)
{
    var lstCarFile = System.IO.File.ReadAllLines(strFilePath);

    var car = new Car();
    foreach (var c in lstCarFile)
    {
        var name = c.Split(',')[0].Trim();
        var value = c.Split(',')[1].Trim();

        car.GetType().GetProperty(name).SetValue(car, value, null);
    }

    return car;
}

尝试以下方法:

var car = GetCarFromFile("D:/CarMembersValue.txt");

要调用上述方法,只需传递文本文件的路径参数:

{{1}}