알 수없는 객체 유형을 비교할 때 문자열에서 대소 문자를 구분하지 않는 비교를 보장하는 방법은 무엇입니까?

BVernon

필터를 추가 할 일반 코드를 작성중인 DataGridView가 있습니다. 열의 기본 데이터 유형은 무엇이든 될 수 있지만 문자열 인 경우 필터에서 대소 문자를 구분하지 않는 비교를 사용하고 싶습니다.

또한 참조 비교를 수행하는 것이 아니라는 것을 확인하기 위해 연산자 Equals대신 메서드를 사용하고 ==있습니다. 문자열 Equals방법은 당신이 선택할 수 있도록하기 위해 과부하가 StringComparison유형을하지만, 나는 내가 단지에 액세스 할 수 그래서 문자열 여부가 될 것 여부를 알 수없는 Equals을 사용할 방법을 object.

유형을 지정할 수 있는 Equals확장 메서드를 작성해 보았습니다 . 객체가 문자열이면 문자열 객체에 대해 적절한 오버로드를 호출 하지만 그렇지 않으면 일반 메서드를 사용 한다는 아이디어 입니다. 그러나 이것은 인스턴스 메서드로 메서드에 액세스 할 수없고 형식을 지정해야한다는 컴파일 오류가 발생하여 작동하지 않는 것 같습니다. 내가 뭔가 잘못한 경우를 대비하여 아래 확장 방법을 포함 시켰습니다. 성급하게 작성했지만 문제가 아니라고 생각합니다. 다른 방법을 찾아야한다고 생각합니다.objectStringComparisonEqualsEquals

public static class Extensions
{
    public static bool Equals(this object obj1, object obj2, StringComparison comparisonType)
    {
        if (obj1 == null && obj2 == null)
            return true;
        if (obj1 == null && obj2 != null)
            return false;
        if (obj1 != null && obj2 == null)
            return false;

        string s = obj1 as string;

        if (s != null)
        {
            var s2 = obj2 as string;
            return s2 != null && s.Equals(s2, comparisonType);
        }
        else
            return obj1.Equals(obj2);
    }
}

따라서 더 나은 접근 방식을 찾고 있거나 위 코드에서 단순히 실수를했다면 알려주십시오.

편집하다:

또한 아래는 소비 코드의 모습입니다. _filters는 아래에 참조 된 것과 같은 몇 가지 속성이있는 개체 목록이며 항목은 IEnumerable<T>입니다.

        foreach (var f in _filters)
        {
            items = items.Where(o => o[f.FieldName].Equals(f.Value, StringComparison.InvariantCultureIgnoreCase));
        }
Reza Aghaei

와 같은 다른 확장 메서드를 사용할 수 있습니다 IsEqual. 그런 다음 메서드 내에서 매개 변수가 문자열인지 확인하고 원하는 방식으로 비교합니다.

예를 들어, 다음 코드와 같습니다. 나는 기능을 테스트하지 않았으며 단지 아이디어를 보여주는 것입니다.

public static class ObjectExtesions
{
    public static bool IsEqual(this object left, object right)
    {
        if (left == null && right == null)
            return true;
        if (left != null && right != null)
        {
            if (left is string && right is string)
                return ((string)left).Equals((string)right,
                    StringComparison.InvariantCultureIgnoreCase);
            else
                return left.Equals(right);
        }
        return false;
    }
}

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

Related 관련 기사

뜨겁다태그

보관