Porównanie stanu (zawartości) dwóch klas.

0

Witam wszystkich

Od niedawna zająłem się Web Services w .Net 4.0 i niestety spotkała mnie pewna przykra niespodzianka, a mianowicie wydaje mi się, że klasa którą pobieram z serwera gdzie uruchomiony jest Web Service traci jakieś swoje właściwości i trochę się różni od tej którą rzeczywiście chciałem pobrać.

Najlepiej na przykładzie:


Class Test {
    public string Name;
    public int ID;
}

Teraz dostaję tą klasę do jakiejś metody z polami zainicjowanymi przez znane mi wartości (np. wiem, że Name to "Znana mi nazwa" i ID to 0) i chciałbym sprawdzić w którym miejscu się różni.


public void metodaSprawdzajaca(Test testDoSprawdzenia)
{
    Test testDoPorownania = new Test();
    testDoPorownania.Name = "Znana mi nazwa";
    testDoPorownania.ID = 0;

    //Teraz chciałbym porównać zawartość klasy testDoSprawdzenia z zawartością klasy testDoPorównania
    //W tym przypadku jest to proste ale nie gdy klasa ma 100 pól - wtedy łatwo o błąd
}

Moje pytanie jest takie: czy jest jakiś sposób na porównanie zawartości dwóch klas? Na przykład poprzez zapisanie ich w pliku tekstowym i podejrzenie przez program do porównywania różnic w plikach (WinMerage).

Będę wdzięczny za każdą podpowiedź.

1
LukTar napisał(a)

Moje pytanie jest takie: czy jest jakiś sposób na porównanie zawartości dwóch klas?

Chodzi Ci może o obiekty? Jeśli tak, to najprostsza będzie serializacja XML.

0

Myślę, że właśnie trafiłeś w sedno, a może jakiś prosty przykład tej serializacji, albo z czym to się je bo jak dotąd nigdy się z tym nie spotkałem.

1

Do pliku można np. tak:

NazwaKlasy obiektKlasy = new NazwaKlasy;

using (FileStream fs = new FileStream(@"D:\plik.xml", FileMode.Create))
{
    new XmlSerializer(typeof(NazwaKlasy)).Serialize(fs, obiektKlasy);
}

Wtedy wartości wszystkich publicznych metod znajdą się w pliku.

Ale pewno można zrobić to bez użycia plików, po prostu napisać metodę, która przy użyciu refleksji porówna wartości wszystkich właściwości danych obiektów.

0

Dzięki Somekind właśnie o to mi chodziło.
Myślę, że temat został rozwiązany :).

2

Jakby co, to napisałem takie coś, może też się przyda:

using System;
using System.Collections.Generic;
using System.Reflection;

namespace PropertyComparerTest
{
    class Person
    {
        public int Id { get; set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public int Age { get; set; }
        public bool Gender { get; set; }
    }

    class ComparisionInfo
    {
        public string Name { get; set; }
        public object FirstValue { get; set; }
        public object SecondValue { get; set; }

        public override string ToString()
        {
            return string.Format("Property: {0} First value: {1} Second value: {2}", this.Name, this.FirstValue, this.SecondValue);
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Person p1 = new Person() { Id = 1, FirstName = "Andrzej", LastName = "Gołota", Age = 15, Gender = true };
            Person p2 = new Person() { Id = 1, FirstName = "Andrzej", LastName = "Golota", Age = 12, Gender = true };

            List<ComparisionInfo> infos = Compare<Person>(p1, p2);

            foreach (var item in infos)
            {
                Console.WriteLine(item);
            }

            Console.ReadLine();
        }

        public static List<ComparisionInfo> Compare<T>(T first, T second)
        {
            List<ComparisionInfo> infos = new List<ComparisionInfo>();

            PropertyInfo[] properties = typeof(T).GetProperties();

            foreach (var item in properties)
            {
                var vf = item.GetValue(first, null);
                var vs = item.GetValue(second, null);

                if (!vf.Equals(vs))
                {
                    infos.Add(new ComparisionInfo() { Name = item.Name, FirstValue = vf, SecondValue = vs });
                }

            }

            return infos;
        }
    }
}
0

Genialnie. Chwile zajęło mi zrozumienie Twojego toku myślenia i przypomnienie sobie typów generycznych, ale lepiej bym tego nigdy nie napisał. Trafiłeś bardziej niż w dziesiątkę :).

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0