3

このような2つのクラスを比較したい

public class Order
{
        public string KundNummer, KundNamn, ErReferens, VarReferens, KontraktsNummer, Betvillk, Levvillk, Levsatt, Speditor,
            Resenh, Projekt, OrderDatum, LeveransDatum, ErtOrdernr, LagerbokfDatum, KundPostAdr, KundPostAdr2, KundGLN, KundPostnr, 
            KundOrt, KundLandKod, KundLand, KundVATnr, KundDistrikt, KundSaljare, KundText1, KundText2, KundText3, KundSprak,
            KundValuta, KundRabattAvtal, KundRabattAvtalBenamning, KundPrislista, KundPrislistaBenamning, KundALnamn, KundALpostAdr, KundALpostAdr2, KundALGLN, KundALpostnr, KundALort,
            KundALlandKod, KundALland;
        public double OrderNummer, Fakturarabatt, Frakt, Expavg, Brutto, Netto, ExklMoms, Totalt, Moms, Avrundn, KundValutaKurs, KundValutaEnhet;
        public int EUPeriodSamman, InklMoms, EjKlar, Levererad, Malukerad, BestallningSkapad, Ordererk,
            Plocklista, Foljesedel, ExtraOrderdokument, Restorder, Faktura, KundSparaText, KundExport, KundRantefakturering, KundKravbrev,
            KundKravavgift, KundRestnoteraEj, KundSamlingsfakturera;
    }

データベースのどのフィールドが変更されたかを記録するために、このクラスの 2 つのオブジェクトを比較したいと考えています。

public string OrderUppdateraOrder(Order order)
    {
        Order OrderToCompare = new Order();
        OrderToCompare = OrderVisaOrderInformation(order.OrderNummer);

        //then the code goes on to make the changes to the database from the class order
        //while OrdertoComapre still have the values from before this function was called
    }

これらのクラスをループして比較することは可能ですか、それともクラス内のすべての変数に対してifを書く必要がありますか? :)

それともリストに変換しますか?知らない?:P

回答ありがとうございます

4

3 に答える 3

3

違いがある場合はログに記録し、次のように違いをログに記録したい CustomerNumber: changed from 456 to 345

おそらく最良の選択肢は、リフレクションを使用してパブリック プロパティとフィールドをクロールし、それらを比較することです。これにより、比較するコードが少なくなりますが、パフォーマンスのオーバーヘッドが発生します。FastMember などのツールを使用すると、そのオーバーヘッドを大幅に削減できます。

static class Program {
    static void Main()
    {
        Order o1 = new Order { Resenh = "abc" },
              o2 = new Order { Resenh = "abc" };
        ShowDiffs(o1, o2); // {nothing}
        o2.Resenh = "def";
        ShowDiffs(o1, o2); // Resenh changed from abc to def
    }
    static void ShowDiffs<T>(T x, T y)
    {
        var accessor = TypeAccessor.Create(typeof(T));
        if (!accessor.GetMembersSupported) throw new NotSupportedException();
        var members = accessor.GetMembers();

        foreach (var member in members)
        {
            object xVal = accessor[x, member.Name],
                   yVal = accessor[y, member.Name];
            if (!Equals(xVal, yVal))
            {
                Console.WriteLine("{0} changed from {1} to {2}",
                    member.Name, xVal, yVal);
            }
        }
    }
}
于 2012-11-21T10:06:12.847 に答える
1

たぶん、このアプローチはあなたを助けることができます

public class Order
{
    public string KundNummer, KundNamn, ErReferens, VarReferens, KontraktsNummer, Betvillk, Levvillk, Levsatt, Speditor,
        Resenh, Projekt, OrderDatum, LeveransDatum, ErtOrdernr, LagerbokfDatum, KundPostAdr, KundPostAdr2, KundGLN, KundPostnr,
        KundOrt, KundLandKod, KundLand, KundVATnr, KundDistrikt, KundSaljare, KundText1, KundText2, KundText3, KundSprak,
        KundValuta, KundRabattAvtal, KundRabattAvtalBenamning, KundPrislista, KundPrislistaBenamning, KundALnamn, KundALpostAdr, KundALpostAdr2, KundALGLN, KundALpostnr, KundALort,
        KundALlandKod, KundALland;
    public double OrderNummer, Fakturarabatt, Frakt, Expavg, Brutto, Netto, ExklMoms, Totalt, Moms, Avrundn, KundValutaKurs, KundValutaEnhet;
    public int EUPeriodSamman, InklMoms, EjKlar, Levererad, Malukerad, BestallningSkapad, Ordererk,
        Plocklista, Foljesedel, ExtraOrderdokument, Restorder, Faktura, KundSparaText, KundExport, KundRantefakturering, KundKravbrev,
        KundKravavgift, KundRestnoteraEj, KundSamlingsfakturera;

    public static bool operator ==(Order left, Order right)
    {
        foreach (var field in left.GetType().GetFields())
        {
            object valueLeft = field.GetValue(left);
            object valueRight = field.GetValue(right);

            if (!object.Equals(valueLeft, valueRight))
                return false;
        }

        return true;
    }

    public static bool operator !=(Order left, Order right)
    {
        return !(left == right);
    }

}
于 2012-11-21T10:04:32.897 に答える
1

私があなたを理解している方法からわかりました-Orderデータベースからオブジェクトを取得するメソッドと、Order最初にデータベースから取得したものの変更されたオブジェクトがあります。次のことを言わずに、1 つまたは複数の注文に変更があるかどうかを確認します。

Database.A が Your.A などと等しい場合、注文ごとに

チェックを 1 か所にまとめて、Equalsメソッドをオーバーライドします。

  public class Order
  {
    public int Id;
    public string SomeProp;
    public string AnotherProp;
    public override bool Equals(object obj)
    {
      Order orderToCompare = (Order)obj;
      return (SomeProp == orderToCompare.SomeProp && AnotherProp == orderToCompare.AnotherProp);
    }
  }

次に、単一の注文を更新するためのメソッドと、多数の注文を更新するためのメソッドの 2 つを用意します。

private void UpdateOrder(Order o)
{
  //Get the corresponding order from the database (I suspect Entity Framework here in order to get an object?)
  Order dbOrder = OrderVisaOrderInformation(o.Id);
  if (dbOrder.Equals(o))
  {
    //Do some update
  }
}
private void UpdateManyOrders(List<Order> orders)
{
  var dbOrders = (from order in orders
                  select OrderVisaOrderInformation(order.Id));
  List<Order> ordersToUpdate = dbOrders.Where(x => !x.Equals(orders.First(y => y.Id == x.Id))).ToList();
  foreach (Order orderToUpdate in ordersToUpdate)
  {
    //Update the order
  }
}

これは間違っているかもしれませんが、私があなたの質問を理解していることから、これがあなたがやりたいことです。

于 2012-11-21T10:06:19.630 に答える