표현식 트리를 사용하여 형식의 인스턴스의 모든 속성을 해당 형식의 다른 인스턴스의 속성과 비교하는 메서드를 동적으로 생성하는 간단한 생성기를 작성하려고합니다. . 이것은 int
string
과 같은 대부분의 속성에서는 정상적으로 작동하지만 DateTime?
(및 다른 null 가능 값 유형)으로는 실패합니다. 표현 트리를 사용하여 개체의 모든 속성 비교
static Delegate GenerateComparer(Type type)
{
var left = Expression.Parameter(type, "left");
var right = Expression.Parameter(type, "right");
Expression result = null;
foreach (var p in type.GetProperties())
{
var leftProperty = Expression.Property(left, p.Name);
var rightProperty = Expression.Property(right, p.Name);
var equals = p.PropertyType.GetMethod("Equals", new[] { p.PropertyType });
var callEqualsOnLeft = Expression.Call(leftProperty, equals, rightProperty);
result = result != null ? (Expression)Expression.And(result, callEqualsOnLeft) : (Expression)callEqualsOnLeft;
}
var method = Expression.Lambda(result, left, right).Compile();
return method;
}
이 함께 실패 DateTime?
재산 : 유형
식 'System.Nullable`1 [System.DateTime] 유형의 매개 변수를 사용할 수 없습니다 'System.Object'메서드의 '부울 같음 (System.Object)'
확인, 따라서을 예상하는 Equals
의 오버로드를 찾습니다.. 그렇다면 왜 DateTime?
을 전달할 수 있습니까? object
으로 변환 가능합니까? Nullable<T>
을 보면 실제로는 Equals(object o)
의 재정의가 있습니다.
PS : 나는 그것을 null
값을 처리 할 수 없기 때문에이 적절한 발전기는 아직 아니라는 것을 알지만 그 :)
UPDATE를 얻을 것이다 :이라 클리스 '대답했다 이 특별한 문제를 해결하기 위해 노력했지만, 결국 나는 충분하다고 생각하는 훨씬 더 간단한 접근법을 찾으러 갔다 : 단지 Expression.Equal
을 사용하라. 내 케이스의 99 %를 커버한다고 생각합니다 (==
을 무시하지 않고 Equals
을 무시할 수 있는지 확실하지 않지만 괜찮습니다).
감사합니다. 그 방법으로 내 문제가 해결되었지만, 결국에는 다른 접근 방식으로 모두갔습니다. – stringargs