문제

런타임에 객체의 유형을 도출하려고합니다. 구체적으로 나는 그것이 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<>))

그러나 반사를 사용할 때는 반사를 사용하지 않을 때는 정상적으로 작동합니다.

나는 내 엔티티의 모든 필드에 대한 인터페이스를 반복하고 싶지 않습니다. 누군가가 이것을하는 다른 방법에 대해 약간의 빛을 발할 수 있습니까? 예, 조기에 최적화하고 있지만 너무 못 생겼으므로 유머를 제발주세요.

경고 :

  1. 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

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top