제네릭을 사용할 때 유형을 어떻게 비교합니까?
-
05-07-2019 - |
문제
런타임에 객체의 유형을 도출하려고합니다. 구체적으로 나는 그것이 icollection 또는 idto를 구현하든 두 가지를 알아야합니다. 현재 내가 찾을 수있는 유일한 솔루션은 다음과 같습니다.
private static bool IsACollection(PropertyDescriptor descriptor)
{
bool isCollection = false;
foreach (Type type in descriptor.PropertyType.GetInterfaces())
{
if (type.IsGenericType)
{
if (type.GetGenericTypeDefinition() == typeof(ICollection<>))
{
isCollection = true;
break;
}
}
else
{
if (type == typeof(ICollection))
{
isCollection = true;
break;
}
}
}
return isCollection;
}
private static bool IsADto(PropertyDescriptor descriptor)
{
bool isDto = false;
foreach (Type type in descriptor.PropertyType.GetInterfaces())
{
if (type == typeof(IDto))
{
isDto = true;
break;
}
}
return isDto;
}
그러나 나는 이것보다 더 나은 방법이 있어야한다고 확신합니다. 나는 다음과 같은 정상적인 방식으로 비교를 시도했습니다.
if(descriptor.PropertyType == typeof(ICollection<>))
그러나 반사를 사용할 때는 반사를 사용하지 않을 때는 정상적으로 작동합니다.
나는 내 엔티티의 모든 필드에 대한 인터페이스를 반복하고 싶지 않습니다. 누군가가 이것을하는 다른 방법에 대해 약간의 빛을 발할 수 있습니까? 예, 조기에 최적화하고 있지만 너무 못 생겼으므로 유머를 제발주세요.
경고 :
- ILIST <> 또는 배열리스트와 같이 일반적이거나 일반일 수는 없기 때문에 icollection 또는 icollection <>을 찾고있는 이유. 그래서 나는 if 문서에서 isgenerictype를 사용하여 iCollection <>를 사용하여 테스트할지 여부를 알기 위해 ISGenericType를 사용해야한다고 가정합니다.
미리 감사드립니다!
해결책
이것:
type == typeof(ICollection)
속성 유형이 있는지 확인합니다 바로 그거죠 ICollection
. 즉, 다음과 같은 사실을 반환 할 것입니다.
public ICollection<int> x { get; set; }
그러나 :
public List<int> x { get; set; }
속성 유형이 있는지 확인하려면 또는 파생되었습니다, ICollection
, 가장 간단한 방법은 사용하는 것입니다 Type.IsAssignableFrom
:
typeof(ICollection).IsAssignableFrom(type)
그리고 일반적인 것도 마찬가지입니다.
typeof(ICollection<>).IsAssignableFrom(type.GetGenericTypeDefinition())
다른 팁
하다 type.IsAssignable
이 경우에 도움을 받으시겠습니까?
편집 : 죄송합니다 Type.IsAssignableFrom
제휴하지 않습니다 StackOverflow