如何通过反射区分值类型,可空值类型,枚举,可空枚举,引用类型?

时间:2011-12-23 09:59:41

标签: c# reflection propertyinfo

如何通过反射区分value-type,nullable value-type,enum,nullable-enum,reference-types?

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 ...中哪些地方可以检索到这些信息?

3 个答案:

答案 0 :(得分:6)

以下是检查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&gt; System.Boolean)。值类型按值传递;它们是struct(ure)而不是类。

答案 1 :(得分:2)

    public void Test(Type desiredType, object value)
    {
        if (desiredType.IsGenericType)
        {
            if (desiredType.GetGenericTypeDefinition() == typeof(Nullable<>))
            {
                if (value == null)
                {
                }
            }
        }
    }

答案 2 :(得分:0)

PropertyType.Name似乎为Non Nullable和Nullable类型提供了不同的输出。可能这对你有点帮助。

实际上它将 Nullable`1 Int32 作为Nullable和Non nullable的输出。