我有一个对象,其中包含许多数据类型的属性,这些属性是搜索大型缓存的设置。我想从基本设置和仅更改中传递此对象上已更改的值。我也希望将这些信息作为一个非常短的字符串传递给我。
所以我需要的是在C#.NET 4中执行此操作的技术(后面是伪代码):
var changes = Diff(changedobject, baseobject);
return changes.ToShortString()
以及后来只知道对象的远程机器
var changedobject = CreateObject(diffstring)
非常感谢任何想法。
由于
答案 0 :(得分:2)
我没有适合你的代码,但这应该很清楚
创建一个使用的元数据类 反射,得到的属性 对象并缓存getter方法 每。然后对于每个属性,它确实如此 如果它是一个复杂的属性,相同, 等...所以你得到一个对象图 类似于你的班级。然后呢 传递了两个相同类型的对象, 这递归循环遍历 元数据和调用getter以便 比较并返回结果。您 也可以通常输入。
实现将是这样的:
public class Metadata<T>
{
private Dictionary<string, Metadata<T>> _properties = new Dictionary<string, Metadata<T>>();
private MethodInfo _getter;
private void BuildMetadata()
{
Type t = typeof (T);
foreach (PropertyInfo propertyInfo in t.GetProperties())
{
// ....
}
}
}
答案 1 :(得分:1)
CSLA.NET框架使用反射来遍历类型的属性和字段,并将它们写入哈希表。然后将此哈希表序列化并存储。
在CSLA.NET项目中,该类型称为UndoableBase
。
我不记得它是否记录了差异,但前提是您需要之前的状态副本(在CSLA案例中,这将是以前序列化的项目)。
假设您有一个项目的副本(实际复制,而不是引用)作为原始源,那么您可以使用反射来检查每个属性,并将其添加到哈希表中(如果已更改)。
通过网络发送此哈希表。
另一个以及我要看的更多内容,是为序列化项目添加前缀,表示即将发生的流中提供了哪些字段。这可能比名称值的哈希表更紧凑。您可以通过首先按字母顺序(或通过其他方式)对字段/属性进行排序,将其包含在您的反射解决方案中。但是,如果您将此序列化数据存储在该类型的各个版本中,则这不是版本容忍的。