Tôi có một lớp với nhiều thuộc tính. Một bản sao nông là đủ để nhân rộng hoàn toàn đối tượng.So sánh hai thuộc tính của đối tượng đơn giản chỉ trong C#
Tôi cần so sánh một đối tượng chỉ để kiểm tra xem đối tượng có chứa chính xác các giá trị giống với một giá trị khác không.
ý tưởng của tôi:
Các giải pháp đầu tiên và rõ ràng nhất là chỉ để tạo ra một khối phương pháp khổng lồ so sánh mỗi tài sản, một sau khi khác.
Thứ hai, sẽ là sắp xếp từng đối tượng và băm tệp hoặc thực hiện một số loại kiểm tra md5 trên đó. (Điều này thực sự sẽ làm việc).
Thứ ba là thực hiện một số loại phản ánh trên đối tượng, điều này sẽ tự động hóa tùy chọn đầu tiên, nhưng tạo ra mức độ phức tạp cao hơn.
Tốc độ không thực sự là vấn đề.
Quan tâm đến việc nghe suy nghĩ hoặc bất kỳ phương pháp nào khác mà tôi thiếu để làm một việc như vậy.
Chỉnh sửa: Cảm ơn tất cả. Giải pháp của tôi: (Sửa đổi để bây giờ được đệ quy về các mục chung).
public static bool IsSame<T>(T objA, T objB)
{
var type = typeof(T);
var properties = type.GetProperties();
foreach (var pi in properties.Where(a => a.CanRead))
{
if (pi.Name == "Item")
{
var piCount = properties.FirstOrDefault(a => a.Name == "Count");
int count = -1;
if (piCount != null && piCount.PropertyType == typeof(System.Int32))
count = (int)piCount.GetValue(objA, null);
if (count > 0)
{
for (int i = 0; i < count; i++)
{
dynamic child1 = pi.GetValue(objA, new object[] { i });
dynamic child2 = pi.GetValue(objB, new object[] { i });
return IsSame(child1, child2);
}
}
}
else
{
var val1 = type.GetProperty(pi.Name).GetValue(objA, null);
var val2 = type.GetProperty(pi.Name).GetValue(objB, null);
if (val1 != val2 && (val1 == null || !val1.Equals(val2)))
return false;
}
}
return true;
}
tôi sẽ đi với sự phản chiếu trừ khi cấu trúc lớp học không dễ bị thay đổi. nếu nó * sẽ không * thay đổi, tôi sẽ chọn giải pháp đầu tiên thay thế (dễ đọc, dễ dàng để sử dụng) – Alex
http://stackoverflow.com/questions/506096/comparing-object-properties-in-c-sharp there giải pháp sử dụng sự phản chiếu. – Giedrius