2014-02-14 4 views
-3

두 개의 일반 객체 입력을 사용하여 두 번째 객체를 첫 번째 객체로 변환 한 다음 두 개를 비교하는 함수가 있습니다.임의 유형의 두 객체의 동등성 비교

기능 :

public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
{ 
    object parameterCast = System.Convert.ChangeType(parameter, value.GetType()); 

    return parameterCast.Equals(value); 
} 

나는 그러나, 내가 해결하는 방법을 잘 모르겠어요이이 문제의 몇 가지가 있다고 생각합니다.

첫 번째는 매개 변수를 값으로 캐스트 할 수없는 경우입니다.

둘째, 각 개체가 null인지 확인해야합니까? 그렇다면 어떻게?

누구든지이 기능을 수정하기위한 제안이나 조언이 있습니까?

도움을 주시면 감사하겠습니다.

+4

이 기능에는 제네릭이 없습니다. –

+0

그리고 [System.Convert.ChangeType] (http://msdn.microsoft.com/en-us/library/ttf5d382%28v=1.0%29.aspx)의 MSDN 설명서를 보면 도움이됩니다. 캐스트가 서포트되어 있지 않은 경우는 InvalidCastException가 Throw됩니다. – Dirk

+0

@TimRogers 예, 죄송합니다. 나는 정말로 그것을 생각할 때 생각하지 않았습니다. 나는 일반적인 의미로 일반적인 의미를 지녔으며, 형식을 알지 못했습니다. – djcmm476

답변

1

별도의 메서드가 필요하지는 않습니다. . 방법을 사용하는 방법에 대한 몇 가지 예를 제시 하시겠습니까?

함수를 수정하는 경우 예제 코드에서는 targetType 또는 culture 인수를 사용하지 않습니다. 또한 반환 값은 Equals 메서드의 결과이므로 함수 이름이 혼란 스럽습니다.

이 방법을 사용하는 대신 parameter == (ParameterTargetType)value을 사용할 수는 있지만 개체를 ​​임의의 형식 또는 클래스로 변환 할 방법이 없으므로이를 구현하기 위해 어떤 방법을 구현하거나 try ... catch ...을 사용해야합니다. 가능한 캐스트 예외를 처리하는 문.

오, 예, 객체가 null인지 확인하려면 object == null을 사용하십시오. if 문으로, 당신은 쓸 수 :

if (value == null) 
{ 
    // Do something if the 'value' object is null. 
} 

1 일반적으로, C#에서 함수가 호출되는 방법을. 그들은 언제나 함수가 클래스의 멤버 일 때입니다. value가 null의 경우 확인

+0

정말 고마워. 나는 그것을 지금 줄 것이다. 형식 종류는 전체 코드가 구조화되어 있기 때문에 동일하게 유지되어야합니다 (변환기를 호출해도 나도 조금씩 던졌습니다.). 방법과 기능의 차이점에 대해서는 분명치 않았습니다. 사용법을 잘 알고 있습니다. – djcmm476

2

가장 정확한 방법은

if (Object.ReferenceEquals(null, value)) { 
    // value is null 
    ... 
    } 

다른 인기있는 방법

입니다
// == operartor can be implemented explicitly 
    if (value == null) {...} 

    // Equals method could be overriden 
    if (Object.Equals(null, value)) {...} 

잠재적 잘못된Equals 방법 때문에 수 및/또는 == operator이 될 수 있습니다 은 재정의/다시 선언 됨입니다.

+0

'value == null'에'=='가 사용됩니까? –

+1

"public static Boolean operator == (ValueClass left, ValueClass right) {...}"이 연산자가 선언 된 경우 ValueClass는 값 클래스입니다. –

+0

"가장 정확한 방법"과 동일한 'null == value' ? –

1

이렇게하면 참조가 동일한 것을 가리키고 있는지 확인한 다음 둘 중 하나가 null인지 확인하여 원하는 것을 반환 할 수 있습니다. 그 다음에 캐스팅을 한 다음이 둘 모두가 통과하는지 비교할 수 있습니다.

if (System.Object.ReferenceEquals(lhs, rhs)) 
{ 
    return true; 
} 
if (System.Object.ReferenceEquals(lhs, null) || System.Object.ReferenceEquals(rhs, null)) 
{ 
    return false; 
} 

그러나 실제로는 일반 기능을 사용하는 것으로 생각합니다. 이런 식으로하면 효과가 있습니다. as TData이 실패하면 equals 연산을 반환하지 않으면 객체는 null이됩니다.

public object Convert<TData>(TData value, object parameter, System.Globalization.CultureInfo culture) 
     where TData : class 
    { 
     TData convertedObject = parameter as TData; 
     if (convertedObject == null) 
      return false; 
     else 
      return value == convertedObject; 
    } 

하지만 테스트되지 않았습니다.

관련 문제