일반 텍스트 상자와 언 바운드 datagridview가 포함 된 '송장'WinForm C#이 있습니다. 'Invoice'클래스 개체를 사용하여 양식 필드의 값을 저장했습니다. DataGridview 행은 'Invoice'의 List < SubInvoice 속성에 저장됩니다.리플렉션을 사용하여 목록의 개체 비교
public static bool CompareObjects(object original, object altered)
{
Type o = original.GetType();
Type a = altered.GetType();
foreach (PropertyInfo p in o.GetProperties(BindingFlags.Public | BindingFlags.Instance))
{
Console.WriteLine("Original: {0} = {1}", p.Name, p.GetValue(original, null));
Console.WriteLine("Altered: {0} = {1}", p.Name, p.GetValue(altered, null));
if (p.GetValue(original, null).ToString() != p.GetValue(altered, null).ToString())
{
//Console.WriteLine("Not Equal");
return false;
}
}
return true;
}
나는 원래 '송장'개체를 통해 루프 반사를 사용하고 변경 '송장'과 비교하는 방법으로 글로벌 클래스를 사용하고 있습니다. 차이가있을 경우 사용자에게 인보이스 저장 여부를 알립니다.
위의 방법은 'Invoice'클래스의 모든 속성에서 올바르게 작동하지만 각 DataGridrow의 값을 'SubInvoice'클래스 개체에 저장하는 List를 확인하는 방법을 알지 못합니다. 목록에있는 개체.
누군가 나에게 도움을 줄 수 있습니까? 나는 또한 stackoverflow 및 다른 포럼에서 비슷한 스레드를 확인했지만 헛된.
업데이트 : 모든 유형의 클래스를 검사하는 글로벌 제네릭 메소드를 만들어야합니다. '송장', '고객'이 될 수 있습니다. 목적은 특정 인스턴스에서 양식에 대한 변경 사항을 추적하고 저장하도록 사용자에게 프롬프트하는 것입니다.
과'a'는'a'가 가지고있는 속성과 동일한 모든 속성을 가지지 않는 한 다른 타입입니다. 평등 비교로 사용할 수있는 값을 반환하도록 ToString()을 오버로드하지 않는 한 속성 중 하나라도 클래스 또는 구조체이면 의도 한대로 작동하지 않습니다. 마지막으로'a'가'o'가 가지고 있지 않은 속성을 가질 경우 가능한 차이를 감지하지 못할 것입니다. –
물론 가능합니다. o와 a는 둘 다 동일한 송장 오브젝트입니다. 유일한 차이점은 보유한 가치입니다. 예를 들어, o (원본에서와 같이)는 총 값 (double totalAmount 속성)으로 300.25 달러를 가질 수 있고 (변경된 것처럼) 동일한 속성 필드에서 총 값으로 $ 525.16을 가질 수 있습니다.'Invoice'클래스에는 double, int, datetime 속성과 DataGridview 값의 각 행을 나타내는 'SubInvoice'클래스 객체 목록이 포함 된 List < subinvoice> 속성이 있습니다. – furor
당신은 http://www.cyotek.com/blog/comparing-the-properties-of-two-objects-via-reflection을 확인하십시오. – Damith