如何从他的ToString水化poco

时间:2015-01-14 10:45:30

标签: c# serialization

我经常创建只有少数原始属性的Poco。 我习惯使用Resharper来覆盖ToString。 Resharper ToString结果如下所示:" Prop1:Val1,Prop2:Val2,...,Propn:Valn"

当应用程序出现错误时,我总是在日志中看到此Poco的ToString。 我想创建一种方法,从他的序列化值中保湿这个Poco。 有了这个,我可以快速单元测试重放日志的潜在错误。

我想用这个签名实现一个方法:

public void HydrateFromToString(string serialised){/*...*/}

我目前正在尝试解决方案,我会在准备好后快速发布。

1 个答案:

答案 0 :(得分:0)

请首先考虑以下马修建议:

  

使用NewtonSoft的JSON。然后ToString()变成刚刚返回JsonConvert.SerializeObject(this);它为您提供了一个可以使用JsonConvert.DeserializeObject(序列化)反序列化的字符串;

避免使用

这是我的工作到目前为止,它是我大多数Poco的良好基础。

    public void HydrateFromToString(string serialised)
    {
        var currentType = GetType();
        foreach (var keyValuePair in serialised.Split(new[]{','}))
        {
            var trimmedKeyValuePair = keyValuePair.Trim();
            var splitted = trimmedKeyValuePair.Split(new[] {':'}, 2);
            if(splitted.Length != 2)
            {
                throw new ArgumentException("There is no comma to separate this keyValuePair : "+trimmedKeyValuePair);
            }
            var propertyName = splitted[0].Trim();
            var value = splitted[1].Trim();
            var propInfo = currentType.GetProperty(propertyName);
            try
            {
                if (propInfo.GetSetMethod() != null)
                {
                    var propertyType = propInfo.PropertyType;

                    if (propertyType.IsEnum)
                    {
                        if (!Enum.IsDefined(propertyType, value))
                                throw new ArgumentException("Enum value not handled!");
                        propInfo.SetValue(this,  Enum.Parse(propertyType, value), null);
                        continue;
                    }
                    propInfo.SetValue(this, Convert.ChangeType(value, propertyType), null);
                }                }
            catch (Exception e)
            {
                   //Log, alert do something!
            }
        }
    }