2009-07-11 14 views
5

Mi piacerebbe vedere se un oggetto è un builtin data type in C#Esiste una funzione per verificare se un oggetto è un tipo di dati incorporato?

Se non fosse possibile, non voglio verificarli tutti.
Cioè, io non lo fanno vuole fare questo:

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

Aggiornamento

Sto cercando di creare un modo ricorsivo PropertyDescriptorCollection in cui i tipi PropertyDescriptor potrebbero non essere builtin valori. Così ho voluto fare qualcosa di simile (nota: questo non funziona ancora, ma ci sto lavorando su di esso):

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); 
    } 

risposta

5

Bene, un modo semplice è quello di elencarli esplicitamente in un set, ad es.

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

... 


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

devo chiedere perché è importante anche se - posso capire come potrebbe fare la differenza se si tratta di un .NET primitive type, ma potrebbe spiegare perché si vuole l'applicazione per comportarsi in modo diverso se si tratta di uno di quelli per C# stesso? È questo per uno strumento di sviluppo?

A seconda della risposta a questa domanda, è possibile prendere in considerazione la situazione con dynamic in C# 4 - che non è un tipo al momento dell'esecuzione in quanto tale, ma è System.Object + un attributo quando applicato a un parametro del metodo ecc. .

+0

Volevo creare in modo ricorsivo un PropertyDescriptorCollection e avevo bisogno di verificare se il tipo è incorporato o meno. Volevo creare una nuova collezione se una delle proprietà non era un tipo incorporato. Aggiungerò ciò che sto cercando di fare nella domanda, forse ciò aiuterà – SwDevMan81

+0

Ma perché questa decisione si baserà sulla specifica C#?Perché vorresti trattare Decimal in un modo, ma DateTime o Guid in un modo diverso? –

+0

Giusto, non dovrebbe essere, quella era una svista da parte mia. Anche System.ValueType dovrebbe essere controllato. – SwDevMan81

9

Non direttamente ma è possibile effettuare le seguenti operazioni di controllo semplificato

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); 
} 

Il controllo IsPrimitive catturerà tutto tranne la stringa, l'oggetto e il decimale.

EDIT

Anche se questo metodo funziona, io preferirei la soluzione di Jon. La ragione è semplice, controlla il numero di modifiche che dovevo apportare alla mia soluzione a causa dei tipi che avevo dimenticato erano o non erano primitivi. È più facile elencarli tutti esplicitamente in un set.

+0

@ Jon solo nascosto nella aggiornamento prima del tuo commento;) – JaredPar

+1

Faresti anche voler verificare che * non * essere IntPtr, che è primitivo ma non integrato. Ecco perché non sono molto appassionato di questo metodo: devi confrontare le due liste e calcolare le differenze, mentre un insieme esplicito significa semplicemente copiare l'elenco letteralmente dalla specifica C# :) –

+0

@ Jared: Da qui la rimozione del mio commento :) (Per coloro che non sono riusciti a prenderlo, la risposta di Jared inizialmente non includeva il decimale. Ho commentato mentre lo stava aggiustando ...) –

1

credo che questo sia uno dei migliori possibilies:

private static bool IsBulitinType(Type type) 
{ 
    return (type == typeof(object) || Type.GetTypeCode(type) != TypeCode.Object); 
} 
Problemi correlati