如何从他的ToString中滋润poco
本文关键字:poco ToString | 更新日期: 2023-09-27 18:37:24
我经常创建只有几个原始属性的Poco。我习惯于使用Resharper来覆盖ToString。Resharper ToString 结果如下所示:"Prop1:Val1,Prop2:Val2,...,Propn:Valn"
当应用程序行为不端时,我总是在日志中看到此 Poco 的 ToString。我想创建一种方法,从他的序列化值中水合这个 Poco。有了它,我可以快速单元测试重播日志的潜在错误。
我想实现一个具有此签名的方法:
public void HydrateFromToString(string serialised){/*...*/}
我目前正在尝试解决方案,准备就绪后我会迅速发布。
请先考虑以下马太建议:
使用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!
}
}
}