숫자 유형과 일치하는 일반 제약
이 질문에 이미 답변이 있습니다.
내가 만들고있는 유창한 테스트 프레임 워크에서 사용할 숫자 유형에 대한 확장 메서드를 작성하려고합니다. 기본적으로 이렇게하고 싶습니다.
public static ShouldBeGreaterThan<T>(this T actual, T expected, string message)
where T : int || T: double || etc...
그냥 where T : struct그도 일치하기 때문에,하지 않습니다 string그리고 bool아마도 다른 내가 잊고 뭔가를합니다. 숫자 유형 만 일치시키기 위해 할 수있는 일이 있습니까? (특히 >and <연산자 를 구현하는 유형 이므로 비교할 수 있습니다 ... 이것이 내가 날짜도 일치한다는 것을 의미하는 경우에는 실제로 중요하지 않습니다. 확장 프로그램은 여전히 내가 예상 한대로 작동합니다.)
이 경우 제네릭을 IComparable인터페이스 로 제한하여 CompareTo메소드에 대한 액세스를 제공합니다. 이 인터페이스를 사용하면 질문에 답할 수 있습니다 ShouldBeGreaterThan.
숫자 유형은 해당 인터페이스를 구현하며 문자열에서도 작동한다는 사실은 그다지 신경 쓰지 않아야합니다.
where T : struct,
IComparable,
IComparable<T>,
IConvertible,
IEquatable<T>,
IFormattable
이것이 제가 숫자 제약에 가장 근접한 것입니다. 모든 숫자 유형은이 5 개의 인터페이스를 구현하지만 IFormattable은 bool로 구현되지 않으며 문자열은 참조 유형이므로 적용 할 수 없습니다.
예를 들어 DateTime을 구현하는 다른 것들이 있습니다. 따라서 실제로 필요한 것은 아니지만 원하지 않는 많은 인스턴스화를 방지합니다.
public static bool IsGreaterThan<T>(this T actual, T comp) where T : IComparable<T>
{
return actual.CompareTo(comp) > 0;
}
원하는 경우 구조체 제약 조건을 추가 할 수도 있습니다.
INumeric필터로 사용하는 것과 같은 일반적인 것이 없기 때문에 숫자로만 제한하는 것은 어렵습니다 . 실제로 여기서 가장 쉬운 방법 은 제약 조건을 고집 하지 않고Comparer<T>.Default.Compare 메서드 내에서 사용 하는 것입니다.
이 내장 유형은 제네릭 IComparable<T>및 비 제네릭을 모두 IComparable지원하고 .NET을 통해 참조 유형, 값 유형 및 해제 된 사용을 지원 Nullable<T>합니다.
전체 내용은 운영자의 사용, 볼 MiscUtil의 Operator클래스 와 GreaterThan당신이 경우에 유용 할 수있는 등 정말 (오히려 인터페이스와) 연산자를 사용하고 싶습니다. 또한 Add등 다른 운영자에 대한 액세스를 제공합니다 .
Stackoverflow는 이런 종류의 질문으로 가득 차 있습니다. 이 검색을보세요 . C #은 숫자로 제한되는 제네릭 형식을 정의하는 방법을 지원하지 않습니다. 슬프게도 가장 좋은 방법은 모든 개체에 확장 메서드를 구현하고 유형에 따라 전환을 수행하거나 int, double, float 등에 대한 메서드 집합을 만드는 것입니다.
이 해결 방법이 도움이 될 수 있습니다 . 정책을 사용하는 해결 방법 . 컴파일 시간 안전성을 제공합니다.
참고 URL : https://stackoverflow.com/questions/3329576/generic-constraint-to-match-numeric-types
'Program Club' 카테고리의 다른 글
| Django : 데이터베이스 항목의 동시 수정으로부터 어떻게 보호 할 수 있습니까? (0) | 2020.10.14 |
|---|---|
| HATEOAS : 절대 또는 상대 URL? (0) | 2020.10.14 |
| iPhone 대 iPad / 브라우저의 HTML5 인라인 동영상 (0) | 2020.10.14 |
| Android 애플리케이션에서 YouTube 비디오를 재생하는 방법은 무엇입니까? (0) | 2020.10.14 |
| Hibernate : 모든 게으른 컬렉션을 가져 오는 모범 사례 (0) | 2020.10.14 |