Есть ли функция, чтобы проверить, является ли объект встроенным типом данных? - PullRequest
5 голосов
/ 12 июля 2009

Я хотел бы посмотреть, является ли объект встроенным типом данных в C #

Я не хочу проверять их всех, если это возможно.
То есть я не хочу сделать это:

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

Обновление

Я пытаюсь рекурсивно создать коллекцию PropertyDescriptorCollection, в которой типы PropertyDescriptor могут не иметь встроенных значений. Поэтому я хотел сделать что-то вроде этого (примечание: это пока не работает, но я работаю над этим):

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

Ответы [ 3 ]

9 голосов
/ 12 июля 2009

Не напрямую, но вы можете выполнить следующую упрощенную проверку

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 будет перехватывать все, кроме строки, объекта и десятичного числа.

РЕДАКТИРОВАТЬ

Пока этот метод работает, я бы предпочел решение Джона. Причина проста: проверьте количество изменений, которые мне пришлось внести в моё решение из-за типов, которые я забыл, были или не были примитивами. Проще просто перечислить их все явно в наборе.

5 голосов
/ 12 июля 2009

Ну, один простой способ - просто явно перечислить их в наборе, например,

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

...


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

Я должен спросить, почему это важно - я могу понять, как это может иметь значение, если это .NET примитивный тип , но не могли бы вы объяснить, почему вы хотите, чтобы ваше приложение работало иначе, если оно один из тех, что для самого C #? Это для инструмента разработки?

В зависимости от ответа на этот вопрос, вы можете рассмотреть ситуацию с dynamic в C # 4 - который не является типом во время выполнения как таковым, но является System.Object + атрибутом применительно к параметр метода и т. д.

1 голос
/ 10 июня 2013

Я думаю, что это одна из лучших возможностей:

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