比较两个对象状态,更新前后

时间:2010-01-28 13:33:42

标签: c# .net-3.5 class memento

首先要做的事情。 我有以下课程:

class Employee
{
    private int employeeID;
    private string firstName;
    private string lastName;
    private bool eligibleOT;
    private int positionID;
    private string positionName;
    private ArrayList arrPhone;
    public IList<Sector> ArrSector {get; private set;}

    //the constructor method takes in all the information of the employee
    public Employee(int empID, string fname, string lname, bool elOT, int pos, string posname)
    {
        employeeID = empID;
        firstName = fname;
        lastName = lname;
        eligibleOT = elOT;
        positionID = pos;
        positionName = posname;
        arrPhone = new ArrayList();
        ArrSector = new List<Sector>();
    }

    //the constructor method takes in the employee id, the first name and the last name of the employee
    public Employee(int empid, string firstname,string lastname)
    {
        employeeID = empid;
        firstName = firstname;
        lastName = lastname;
    }

    //overtides the first name and the last name as a string.
    public override string ToString()
    {
        return firstName +" "+lastName;
    }



    public int EmployeeID
    {
        get { return employeeID; }
        set { employeeID = value; }
    }

    public string FirstName
    {
        get { return firstName; }
        set { firstName = value; }
    }

    public string LastName
    {
        get { return lastName; }
        set { lastName = value; }
    }

    public bool EligibleOT
    {
        get { return eligibleOT; }
        set { eligibleOT = value; }
    }

    public int PositionID
    {
        get { return positionID; }
        set { positionID = value; }
    }

    public string PositionName
    {
        get { return positionName; }
        set { positionName = value; }
    }

    public ArrayList ArrPhone
    {
        get { return arrPhone; }
        set { arrPhone = value; }
    }



    // The function assigns all the variables associated to the employee to a new object.
    public static object DeepClone(object obj)
    {
        object objResult = null;
        using (MemoryStream ms = new MemoryStream())
        {
            BinaryFormatter bf = new BinaryFormatter();
            bf.Serialize(ms, obj);
            ms.Position = 0;
            objResult = bf.Deserialize(ms);
        }
        return objResult;
    }

   //Memento pattern is used to save the employee state.
   //The changes will be rolled back if the update button not clicked
    public class Memento : IMemento
    {
        private Employee originator = null;
        private int employeeID;
        private string firstName;
        private string lastName;
        private bool eligibleOT;
        private int positionID;
        private string positionName;
        private ArrayList arrPhone;
        private IList<Sector> arrSector;

        public Memento(Employee data)
        {
            this.employeeID = data.EmployeeID;
            this.firstName = data.FirstName;
            this.lastName = data.LastName;
            this.eligibleOT = data.EligibleOT;
            this.positionID = data.PositionID;
            this.positionName = data.PositionName;
            this.arrPhone = data.ArrPhone;

            this.originator = data;
            this.arrSector = Extensions.Clone<Sector>(data.ArrSector);
        }

}

我在winforms中使用C sharp。我的应用程序的前端在左端有一个列表框,其中有一个雇员的名字。在左侧,有不同的文本框,对应于在列表框中选择的员工。我的编码方式是每当我选择一名员工时,其属性(如员工ID,姓名,职位等)都会显示在这些字段中。

如果用户更改了员工的任何属性,则必须单击更新按钮才能对数据库进行更改。 现在真正的问题是,当用户更改所选员工的任何字段,并选择另一名员工而不点击更新按钮时,我想显示一个弹出框告诉用户如果他选择了另一名员工,则所有更改都将是丢失。

因此我创建了一个momento类来保持员工的先前状态。 我也试过重载==运算符

        public static bool operator ==(Employee e, Memento m)
        {
            return ((e.employeeID == m.employeeID) &&
               (e.firstName == m.firstName) &&
               e.lastName == m.lastName &&
               e.eligibleOT == m.eligibleOT &&
               e.positionID == m.positionID &&
               e.positionName == m.positionName &&
               e.arrPhone == m.arrPhone &&
               e.ArrSector == m.arrSector);
        }

        public static bool operator !=(Employee e, Memento m)
        {
            return (e.employeeID != m.employeeID);
        }

我的想法是比较这两个对象...... 但是没有成功。我该怎么做?如果做出更改,我如何显示弹出窗口。我在哪里放置代码来显示弹出窗口?

2 个答案:

答案 0 :(得分:2)

提醒一句......在==!=运算符中使用不同的逻辑通常不是一个好主意。能够让==!=同时成为false有点不直观。

if(!(a == b) && !(a != b))
{
    // head explodes
}

除此之外,我猜你在比较代码中将Employee类引用为object(或其他父类)。也许是这样的:

if(listBox1.SelectedItem != currentMemento)
{
    ...
}

如果是这种情况,则编译器不会将!=绑定到您的自定义实现。将listBox1.SelectedItem投射到Employee以强制执行此操作。

if((Employee)listBox1.SelectedItem != currentMemento)
{
    ...
}

但是,您可以采取许多其他方法来解决此问题:

  • 完全在GUI端实现实现,当文本字段中的数据发生更改时,bool设置为true,然后在更改员工时检查该标志
  • 实施IComparableIEquatable接口
  • 覆盖Equals和/或Employee
  • 上的Memento方法

(如果你选择第二个选项,通常建议你完成第三个选项)

示例

以下是您可以执行的操作的示例(我假设您有一个名为ListBox的{​​{1}}并且您已使用listBox1附加到SelectedIndexChanged事件功能):

listBox1_SelectedIndexChanged

你必须为我留下评论的领域提供你自己的逻辑,但这个想法应该非常简单。

答案 1 :(得分:-1)

查看IComparable接口。它要求您实现您需要进行此类比较的方法。 KB article,希望它能为你翻译英语,在我的电脑上它总是变成德语。

-sa