2008-10-10 8 views
1

Nullable(of Enum)이 리플렉션을 통해 실제로 Enum인지 여부를 어떻게 결정합니까?리플렉션을 사용하는 .NET 동적 오브젝트

T 유형의 객체를 데이터베이스 호출에서 검색 한 IDataReader으로 동적으로 채우는 방법으로 작업하고 있습니다. 본질적으로, 그것은 데이터 아더의 서수 및 모든 속성 T을 반복하고 서수 이름과 일치하는 속성을 채 웁니다 (또한 일부 속성 마법은 열 이름을 변경하기 위해 throw됩니다). 다른 모든 상황에서는 효과가 있지만, 에 System.Enum을 입력하면 대신 System.ValueType을 찾습니다. 따라서 Enum 검사가 실패하고 메서드가 폭탄이됩니다.

[편집 : Type.IsEnum은 내가 필요한 방식으로 작동하지 않습니다. 여기서 가장 중요한 문제는 T의 BaseType 계층 구조에있는 것이 Enum이라고 말하지 않는다는 것입니다. 마치 Nullable 유형을 내 Enum 권리를 상실한 것처럼 만드는 것입니다.]

아이디어가 있으십니까?

답변

7

그것은 성가신 약간의 : 유형이 typeof(Nullable<>) 동일한 경우 PropertyInfo.PropertyType

  • 테스트에 대한 IsGenericType이 경우
  • 에서

    • 가져 오기 유형, GetGenericTypeDefinition()
    • 와 일반 유형을 얻을, 당신이 가지고 Nullable
    • Nullable.GetUnderlyingType(propertyInfo.PropertyType)
    • 의 기본 유형 (즉, Enum) 가져 오기
  • +0

    오늘 COM 유형의 일부 반사 물건. 한숨. 그들이 관리되고 있어도 제네릭 타입이 정말 좋지 않은 것 같습니다.) – OregonGhost

    +0

    솔리드가 내 친구에게 대답했습니다. 여기에 if 문이 있습니다 : var property = [mytype] .GetType(). GetProperty ([propertyname]); (Nullable <>) && typeof (열거 형) .IsAssignableFrom (Nullable.GetUnderlyingType (property.PropertyType)))) if (property.PropertyType.GetGenericTypeDefinition() – Merritt

    0

    귀하의 질문에 명확하지 않습니다. .HasValue을 사용하여 Nullable에 Enum 또는 null이 있지만 질문의 목적이 아닌 것으로 판단 할 수 있습니다. 리플렉션을 사용하여 변수 유형을 가져오고 Object에서 IDataReader의 데이터를 해당 유형으로 캐스팅 했습니까?

    0

    IDataReader에서 반환되는 열은 항상 Nullable입니까? 그렇다면 간단한 방법으로 확인하십시오.

    AnEnum? enumObj; 
    if (enumObj.HasValue) 
    { 
        enumObj.Value.GetType().IsEnum(); 
    } 
    

    희망이 있습니다.

    0

    나는 그 질문이 정확하게 분명하지 않다고 생각한다. OregonGhost의 제작 코드에서 트릭을 사용했습니다. 열거 형 목록이 작을 때 좋지만 계층 구조가 커짐에 따라 느려질 수 있습니다 (100 개 항목 이상 읽음).

    나는 또한 (예 : 열거 형 클래스의 필드/속성을 나타내는 등) 상속 계층 구조에서 여러 클래스에 걸쳐있는 개념이있을 때 열거 값 체인을 사용하려면

    : 내가 한 일에

    class Base 
    { 
        enum BaseEnum 
        { 
        Val1, 
        Val2, 
        LastVal 
        } 
    } 
    
    class Derived 
    { 
        enum DerivedEnum 
        { 
        Val3 = BaseEnum.LastVal, 
        Val4, 
        LastVal 
        } 
    }