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

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

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中,哪些信息可以被检索?

以下是检查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)而不是类。

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

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

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