2012-10-29 3 views
0

오브젝트가 기본 유형 (char, int, var, string (C#에서는 기본 유형입니까?)인지 확인 가능). 그 이유는 객체의 필드를 가져 오는 파서 (parser)를 만들고 싶기 때문이며, 객체를 가로 지르는 경우 내부에서 다른 객체 인 경우 값을 가져올 수 없기 때문에 필드를 재귀 적으로 가져옵니다. 거기도. 예를 들어 그래서 :오브젝트가 basetype이 아닌지 확인하십시오.

for (int x = 0; x < elements.Length; x++) 
    { 
     FieldInfo currenField = fields[x]; 

     if (currenField is object) //This doesn't work because its of type "FieldInfo" 
     { 
      //pass in the current object into the function 
     } 
     else 
     { 
      elements[x] = new XElement(currenField.Name, currenField.GetValue(obj).ToString()); 
     } 

불행히도 나는 온라인 아무것도 찾을 수가 없어이 쉽게의 경우 기본 유형을 파악 할 수 있습니다. 다음 중 하나도 불가능합니다.

 currenField.GetType is typeof(object) 

TLDR; 어떤 것이 기본 유형인지 아닌지를 판단 할 수 없으며 동일한 효과를 내기 위해 유형을 비교할 수도없고

어떤 도움을 주셔서 감사합니다!

+0

질문에 대한 답변을 얻으려면 먼저 "기본 유형"이 무엇을 의미하는지 설명해야합니다. 표준 용어가 아닙니다. –

+0

기본 유형 일 수 있습니까? – rekire

+0

맞아, 웬일인지 나는 그것을 내려 놓고 바꿨다. 당신이 옳은 기본 유형. –

답변

4

"기본 유형"이라고하는 것은 실제로 기본 유형으로 간주됩니다. 유형이 IsPrimitive 속성을 사용하여 원시 형의 경우를 결정할 수 있습니다

var type = currenField.GetType(); 
if(type.IsPrimitive) 
    // Primitive type 
else 
    // Other type 
+0

OP가 자신의 데이터를 직렬화하려고 시도하는 것 같습니다. 이 경우 실제로는 관련이 없습니다. – Servy

+0

+1 그 OP가 어땠을 가능성이 가장 높습니다. 그러나, 파싱 될 수있는 타입이있을 수 있지만 'IsPrimitive'조건 (예를 들어'DateTime')에 의해 커버되지는 않을 수 있음에주의해야합니다. – GolfWolf

+0

@Servy - 물론 OP가 자신의 직렬화 코드를 작성하려고하지 않는 한 (연습 연습 등으로) –

0

보통 IsPrimitive이 충분하다,하지만 좀 더 자세한 정보가 필요하면, 나는 Type.GetTypeCode()를 권 해드립니다.

var typeCode = Type.GetTypeCode(currenField.GetType()); 

switch (typeCode) 
{ 
    case TypeCode.Boolean: 
     break; 
    case TypeCode.Byte: 
     break; 
    case TypeCode.Char: 
     break; 
    case TypeCode.DBNull: 
     break; 
    case TypeCode.DateTime: 
     break; 
    case TypeCode.Decimal: 
     break; 
    case TypeCode.Double: 
     break; 
    case TypeCode.Empty: 
     break; 
    case TypeCode.Int16: 
     break; 
    case TypeCode.Int32: 
     break; 
    case TypeCode.Int64: 
     break; 
    case TypeCode.Object: 
     break; 
    case TypeCode.SByte: 
     break; 
    case TypeCode.Single: 
     break; 
    case TypeCode.String: 
     break; 
    case TypeCode.UInt16: 
     break; 
    case TypeCode.UInt32: 
     break; 
    case TypeCode.UInt64: 
     break; 
    default: 
     break; 
} 
관련 문제