Как провести различие между типом значения, обнуляемым типом значения, перечислением, обнуляемым перечислением, ссылочными типами через отражение? - PullRequest
4 голосов
/ 23 декабря 2011

Как провести различие между типом значения, типом значения NULL, перечислением, NULL, списком типов через отражение?

enum MyEnum
    {
        One,
        Two,
        Three
    }

    class MyClass
    {
        public int IntegerProp { get; set; }
        public int? NullableIntegerProp { get; set; }
        public MyEnum EnumProp { get; set; }
        public MyEnum? NullableEnumProp { get; set; }
        public MyClass ReferenceProp { get; set; }
    }

    class Program
    {
        static void Main(string[] args)
        {   
            Type classType = typeof(MyClass);

            PropertyInfo propInfoOne = classType.GetProperty("IntegerProp");
            PropertyInfo propInfoTwo = classType.GetProperty("NullableIntegerProp");
            PropertyInfo propInfoThree = classType.GetProperty("EnumProp");
            PropertyInfo propInfoFour = classType.GetProperty("NullableEnumProp");
            PropertyInfo propInfoFive = classType.GetProperty("ReferenceProp");

            propInfoOne.???
            ...............
            ...............
        }
    }

Где в propInfo ... s можно получить эту информацию

Ответы [ 3 ]

6 голосов
/ 23 декабря 2011

Здесь вы можете проверить типы enum, nullable, primitve и value;

Console.WriteLine(propInfoOne.PropertyType.IsPrimitive); //true
Console.WriteLine(propInfoOne.PropertyType.IsValueType); //false, value types are structs

Console.WriteLine(propInfoThree.PropertyType.IsEnum); //true

var nullableType = typeof (Nullable<>).MakeGenericType(propInfoThree.PropertyType);
Console.WriteLine(nullableType.IsAssignableFrom(propInfoThree.PropertyType)); //true

Обратите внимание, что типы значений и примитивы - это разные вещи. Примитивы - это просто сокращения, которые отображаются на типы (например, bool> System.Boolean). Типы значений передаются по значению; это struct (ure) не классы.

2 голосов
/ 23 декабря 2011
    public void Test(Type desiredType, object value)
    {
        if (desiredType.IsGenericType)
        {
            if (desiredType.GetGenericTypeDefinition() == typeof(Nullable<>))
            {
                if (value == null)
                {
                }
            }
        }
    }
0 голосов
/ 23 декабря 2011

Кажется, что PropertyType.Name дает различный вывод для типов Nullable и Nullable. Может быть, это может немного помочь вам.

На самом деле он выдает Nullable`1 Int32 в качестве вывода для Nullable и Nonululble.

...