我的应用程序中有多个业务对象(C#,Winforms,WinXP)。当用户在UI上执行某些操作时,这些对象中的每一个都会被应用程序的不同部分修改和更新。每次修改后,我需要首先检查已更改的内容,然后记录对对象所做的更改。记录这个目的是为了创建一个对应用程序中正在进行的活动的全面跟踪。捕获对象属性的更改
这些对象中包含许多包含其他对象的名单,这嵌套可以几个层次深。对于任何解决方案的两个主要要求是
- 捕捉尽可能准确地
- 保持性能成本最低的变化。
如业务对象:
public class MainClass1
{
public MainClass1()
{
detailCollection1 = new ClassDetailCollection1();
detailCollection2 = new ClassDetailCollection2();
}
private Int64 id;
public Int64 ID
{
get { return id; }
set { id = value; }
}
private DateTime timeStamp;
public DateTime TimeStamp
{
get { return timeStamp; }
set { timeStamp = value; }
}
private string category = string.Empty;
public string Category
{
get { return category; }
set { category = value; }
}
private string action = string.Empty;
public string Action
{
get { return action; }
set { action = value; }
}
private ClassDetailCollection1 detailCollection1;
public ClassDetailCollection1 DetailCollection1
{
get { return detailCollection1; }
}
private ClassDetailCollection2 detailCollection2;
public ClassDetailCollection2 DetailCollection2
{
get { return detailCollection2; }
}
//more collections here
}
public class ClassDetailCollection1
{
private List<DetailType1> detailType1Collection;
public List<DetailType1> DetailType1Collection
{
get { return detailType1Collection; }
}
private List<DetailType2> detailType2Collection;
public List<DetailType2> DetailType2Collection
{
get { return detailType2Collection; }
}
}
public class ClassDetailCollection2
{
private List<DetailType3> detailType3Collection;
public List<DetailType3> DetailType3Collection
{
get { return detailType3Collection; }
}
private List<DetailType4> detailType4Collection;
public List<DetailType4> DetailType4Collection
{
get { return detailType4Collection; }
}
}
//more other Types like MainClass1 above...
我可以假设,我将有机会获得旧值和对象的新值。
在这种情况下,我能想到的2种方式,试图做到这一点没有被告知哪些已明确改变。
- 使用反射和迭代通的对象的所有属性和比较 那些与老对象的相应属性 。日志 已更改的任何属性。这 方法似乎更加灵活, ,我不会担心,如果任何 新属性添加到任何 对象。但它也似乎表现沉重。
- 在setter中记录所有对象的所有属性的更改。 除了这个将 需要我改变很多代码的事实外,它似乎更加蛮力。这将是 维护繁重和不灵活,如果 某人更新任何对象 类型。但这种方式也可能是 性能与光,因为我不会 需要检查哪些改变和日志 性质被改变什么。
建议以上述方法更好的方法和/或改进,欢迎
我写了一个reflction为基础,但预编译单个对象(对)比较器这样回答。所以它可以做得相对便宜。打开弓,不能看 - 但会尝试稍后找到它。 – 2010-09-29 15:20:14