Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Determine if reflected property can be assigned null

I wish to automagically discover some information on a provided class to do something akin to form entry. Specifically I am using reflection to return a PropertyInfo value for each property. I can read or write values to each property from my "form", but if the property is defined as "int", I would not be able to, and my program should not even try, to write a null value.

How can I use reflection to determine if a given property can be assigned a null value, without writing a switch statement to check for every possible type? In particular I want to detect the difference between boxed types like "int" vs. "int?", since in the second case I do want to be able to write a null value. The IsValueType and IsByRef don't seem to see a difference.

public class MyClass {     // Should tell me I cannot assign a null     public int Age {get; set;}      public DateTime BirthDate {get; set;}     public MyStateEnum State {get; set;}     public MyCCStruct CreditCard {get; set;}      // Should tell me I can assign a null     public DateTime? DateOfDeath {get; set;}     public MyFamilyClass Famly {get; set;} } 

Note that I need to determine this information long before I actually attempt to write the value, so using exception handling wrapped around SetValue is not an option.

like image 291
David Avatar asked Nov 20 '09 12:11

David


2 Answers

You need to handle null references and Nullable<T>, so (in turn):

bool canBeNull = !type.IsValueType || (Nullable.GetUnderlyingType(type) != null); 

Note that IsByRef is something different, that allows you to choose between int and ref int / out int.

like image 143
Marc Gravell Avatar answered Oct 25 '22 20:10

Marc Gravell


From http://msdn.microsoft.com/en-us/library/ms366789.aspx

if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Nullable<>)) 

Type would be your PropertyInfo.PropertyType

like image 39
Jonas Lincoln Avatar answered Oct 25 '22 21:10

Jonas Lincoln