背景:这个问题是关于在C#.NET 4.0中记录POCO类的更改跟踪。
假设我有一个带有Name(string)属性的Person类。该Name属性有一个名为[IsDirty(true / false)]的自定义属性,由属性审计类动态设置。
[IsDirty(true)]
public string Name { get; set; }
在检测到更改并设置了属性后,我将通过常规XML序列化在MS SQL数据库(XML列类型)中存储对象。
我无法弄清楚的是,是否有可能以某种方式序列化我的自定义属性IsDirty及其当前值 - 最好是作为序列化XML元素(Name)上的XML属性,以便最终的xml如下: p>
<Name IsDirty="true">John</Name>
任何想法/信息都将不胜感激 -
答案 0 :(得分:2)
我认为你必须为此编写自己的XML序列化,并混合使用一些反射来检查属性的属性值。
有一个很好的指南来实现IXMLSerializable
接口here。遗憾的是,您必须实现类中所有属性的序列化,但从好的方面来说,如果正确实现IXmlSerializable
,您仍然可以使用XmlSerializer
类。
在序列化代码中,您可以使用以下内容检查属性值:
public class YourClass : IXmlSerializable
{
[IsDirty(true)]
public string Name { get; set; }
// skipped ReadXml and GetSchema interface methods for brevity
public void WriteXml(XmlWriter writer)
{
writer.WriteStartElement("YourClass");
var myType = typeof(YourClass);
foreach(var propInfo in myType.GetProperties())
{
writer.WriteStartElement(propInfo.Name);
foreach(var attr in propInfo.GetCustomAttributes(typeof(IsDirtyAttribute), false))
{
var myAttr = attr as IsDirtyAttribute;
writer.WriteAttributeString("Dirty", attr.Value ? "true" : "false");
}
writer.WriteEndElement();
}
writer.WriteEndElement();
}
}
此代码未经测试并从内存中写入,因此可能存在一些潜伏的错误,但希望它能让您走上正确的轨道。
答案 1 :(得分:0)
可以通过手动读取属性及其值来实现。您可以通过在附加/读取xml和属性的方法中包装序列化和反序列化来实现此目的。
但是我会从具有属性IsDirty的基类继承这些类,那么你不用担心!