anonymous anonymous - 9 months ago 41
C# Question

How to differentiate between value-type, nullable value-type, enum, nullable-enum, reference-types through reflection?

How to differentiate between value-type, nullable value-type, enum, nullable-enum, reference-types through 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.???
...............
...............
}
}


Where in the propInfo...s these information can be retrieved?

Answer Source

Here is how you check for enum, nullable, primitve and value types;

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

Note that value types and primitives are different things. Primitives are simply shorthands that map to types (e.g bool > System.Boolean). Value types are passed by value; they are struct(ure)s not classes.