C# 如何将poco从其ToString中水合

C# 如何将poco从其ToString中水合,c#,serialization,C#,Serialization,我经常创建只有几个基本属性的Poco。 我习惯于使用Resharper覆盖ToString。 Resharper ToString结果看起来像:Prop1:Val1,Prop2:Val2,…,Propn:Valn 当应用程序出现错误时,我总是在日志中看到这个Poco的ToString。 我想创建一个方法,将这个Poco从他的序列化值中提取出来。 有了它,我可以通过回放日志快速单元测试潜在的bug 我想用这个签名实现一个方法: public void HydrateFromToString(str

我经常创建只有几个基本属性的Poco。 我习惯于使用Resharper覆盖ToString。 Resharper ToString结果看起来像:Prop1:Val1,Prop2:Val2,…,Propn:Valn

当应用程序出现错误时,我总是在日志中看到这个Poco的ToString。 我想创建一个方法,将这个Poco从他的序列化值中提取出来。 有了它,我可以通过回放日志快速单元测试潜在的bug

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

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

我目前正在尝试一个解决方案,准备好后我会很快地把它贴出来。

< P>请首先考虑马修的建议:

使用来自NewtonSoft的JSON。然后ToString变成just return JsonConvert.SerializeObjectthis;它提供了一个字符串,您可以使用JsonConvert.DeserializeObjectSerialized反序列化

避免使用这个

这是我迄今为止的工作,它是我大部分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!
            }
        }
    }

ToString不保证并且默认情况下不会生成对象的序列化表示。如果您有一个对象的序列化表示,那么您所需要的只是一个适当的反序列化器。关键是我使用的resharper总是以这种格式生成ToString。您应该使用JSON newtonsoft来编写日志。反序列化是免费的,我觉得你是对的,我正在重新实现一个糟糕的JsonYep版本,完全同意-使用NewtonSoft的JSON。然后ToString变成just return JsonConvert.SerializeObjectthis;它提供了一个字符串,您可以使用JsonConvert.DeserializeObjectSerialized反序列化;不要重新发明轮子