2009-07-11 1 views
5

개체가 C에서 builtin data type인지 확인하고 싶습니다.개체가 기본 제공 데이터 형식인지 확인하는 기능이 있습니까?

가능한 경우 모든 개체를 확인하고 싶지 않습니다. 이다
, 내가하지이 작업을 수행 할 할 : 나는 반복적으로의 PropertyDescriptor 유형 값을 내장 될 수있는 PropertyDescriptorCollection을 만들려고 해요

 Object foo = 3; 
     Type type_of_foo = foo.GetType(); 
     if (type_of_foo == typeof(string)) 
     { 
      ... 
     } 
     else if (type_of_foo == typeof(int)) 
     { 
      ... 
     } 
     ... 

업데이트. 그래서 내가 이런 걸하고 싶어 (참고 :이 아직 작동하지 않습니다,하지만 난 그게 중이 야) :

public override PropertyDescriptorCollection GetProperties(Attribute[] attributes) 
    { 
     PropertyDescriptorCollection cols = base.GetProperties(attributes); 

     List<PropertyDescriptor> list_of_properties_desc = CreatePDList(cols); 
     return new PropertyDescriptorCollection(list_of_properties_desc.ToArray()); 
    } 

    private List<PropertyDescriptor> CreatePDList(PropertyDescriptorCollection dpCollection) 
    { 
     List<PropertyDescriptor> list_of_properties_desc = new List<PropertyDescriptor>(); 
     foreach (PropertyDescriptor pd in dpCollection) 
     { 
      if (IsBulitin(pd.PropertyType)) 
      { 
       list_of_properties_desc.Add(pd); 
      } 
      else 
      { 
       list_of_properties_desc.AddRange(CreatePDList(pd.GetChildProperties())); 
      } 
     } 
     return list_of_properties_desc; 
    } 

    // This was the orginal posted answer to my above question 
    private bool IsBulitin(Type inType) 
    { 
     return inType.IsPrimitive || inType == typeof(string) || inType == typeof(object); 
    } 

답변

5

글쎄, 쉬운 방법 중 하나는 집합에 명시 적으로 나열하는 것입니다. 나는 그것이 .NET primitive type을의 경우이 차이를 만들 수있는 방법을 이해할 수있다, 그러나 당신은 당신이에 대한 것들 중 하나입니다 경우 응용 프로그램이 다르게 작동 할 것 인 이유를 설명 할 수 -

static readonly HashSet<Type> BuiltInTypes = new HashSet<Type> 
    (typeof(object), typeof(string), typeof(int) ... }; 

... 


if (BuiltInTypes.Contains(typeOfFoo)) 
{ 
    ... 
} 

나는 그것이 비록 중요한 이유 물어 봐야 C# 자체? 이 도구는 개발 도구입니까?

해당 질문에 대한 대답에 따라 C# 4에서 dynamic으로 상황을 고려할 수 있습니다. 이는 실행시 유형이 아니며 메서드 매개 변수 등에 적용될 때 System.Object + 특성입니다. .

+0

재귀 적으로 PropertyDescriptorCollection을 만들고 싶습니다. 유형이 내장되어 있는지 확인해야했습니다. 속성 중 하나가 기본 유형이 아닌 경우 새 컬렉션을 만들고 싶습니다. 아픈 질문에 무엇을하려하는지, 아마도 도움이 될지 모르겠다. – SwDevMan81

+0

하지만 그 결정은 C# 사양을 기반으로했을까요?Decimal을 한 가지 방법으로 처리하고 싶지만, DateTime 또는 Guid를 다른 방식으로 처리해야하는 이유는 무엇입니까? –

+0

맞아, 그렇게해서는 안된다. 그건 내 부분에 대한 감시였다. System.ValueType도 확인해야합니다. – SwDevMan81

9

을하지 직접하지만, 다음과 같은 간단한 검사를 할 수

public bool IsBulitin(object o) { 
    var type = o.GetType(); 
    return (type.IsPrimitive && type != typeof(IntPtr) && type != typeof(UIntPtr)) 
     || type == typeof(string) 
     || type == typeof(object) 
     || type == typeof(Decimal); 
} 

IsPrimitive 검사는 string, object 및 decimal을 제외한 모든 것을 catch합니다.

이 방법은 작동하지만

편집, 난 존의 솔루션을 선호하는 것이다. 그 이유는 간단합니다. 왜냐하면 내가 잊었던 유형 때문에 원시 코드가 아니거나 기본 코드가 아니기 때문에 필자가 솔루션에 대해 수정해야하는 수를 확인했습니다. 그 세트를 명시 적으로 모두 나열하는 것이 더 쉽습니다.

+0

@ 존은 당신의 코멘트를하기 전에 업데이트에 몰래 당신은 또한 *을 IntPtr를,없는 * 그것을 확인하고 싶은 것) – JaredPar

+1

하는 기본이지만 내장되어 있지는 않습니다. 그래서 나는이 방법에 열중하지 않습니다. 명시 적 세트는 C# 스펙에서 축 어적으로 축약어를 복사하는 것을 의미하는 반면, 두리스트를 비교하고 차이점을 해결해야합니다. –

+0

@Jared : 따라서 제 제거 코멘트 :) (Jared의 대답은 처음에는 십진수를 포함하지 않았다. 나는 그것을 고치면서 ...) –

1

나는 이것이 최고의 possibilies의 하나라고 생각 :

private static bool IsBulitinType(Type type) 
{ 
    return (type == typeof(object) || Type.GetTypeCode(type) != TypeCode.Object); 
} 
관련 문제