필터를 추가 할 일반 코드를 작성중인 DataGridView가 있습니다. 열의 기본 데이터 유형은 무엇이든 될 수 있지만 문자열 인 경우 필터에서 대소 문자를 구분하지 않는 비교를 사용하고 싶습니다.
또한 참조 비교를 수행하는 것이 아니라는 것을 확인하기 위해 연산자 Equals
대신 메서드를 사용하고 ==
있습니다. 문자열 Equals
방법은 당신이 선택할 수 있도록하기 위해 과부하가 StringComparison
유형을하지만, 나는 내가 단지에 액세스 할 수 그래서 문자열 여부가 될 것 여부를 알 수없는 Equals
을 사용할 방법을 object
.
유형을 지정할 수 있는 Equals
확장 메서드를 작성해 보았습니다 . 객체가 문자열이면 문자열 객체에 대해 적절한 오버로드를 호출 하지만 그렇지 않으면 일반 메서드를 사용 한다는 아이디어 입니다. 그러나 이것은 인스턴스 메서드로 메서드에 액세스 할 수없고 형식을 지정해야한다는 컴파일 오류가 발생하여 작동하지 않는 것 같습니다. 내가 뭔가 잘못한 경우를 대비하여 아래 확장 방법을 포함 시켰습니다. 성급하게 작성했지만 문제가 아니라고 생각합니다. 다른 방법을 찾아야한다고 생각합니다.object
StringComparison
Equals
Equals
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));
}
와 같은 다른 확장 메서드를 사용할 수 있습니다 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] 삭제
몇 마디 만하겠습니다