We have a property of type long? that gets filled with an int.
This works fine when i just set the property directly obj.Value = v; but when i try and set the property through reflection info.SetValue(obj, v, null); it gives me a the following exception:
Object of type 'System.Int32' cannot be converted to type 'System.Nullable`1[System.Int64]'.
This is a simplified scenario:
    class TestClass     {         public long? Value { get; set; }     }      [TestMethod]     public void TestMethod2()     {         TestClass obj = new TestClass();         Type t = obj.GetType();          PropertyInfo info = t.GetProperty("Value");         int v = 1;          // This works         obj.Value = v;          // This does not work         info.SetValue(obj, v, null);     }   Why does it not work when setting the property through reflection while it works when setting the property directly?
Check full article : How to set value of a property using Reflection?
full code if you are setting value for nullable type
public static void SetValue(object inputObject, string propertyName, object propertyVal) {     //find out the type     Type type = inputObject.GetType();      //get the property information based on the type     System.Reflection.PropertyInfo propertyInfo = type.GetProperty(propertyName);      //find the property type     Type propertyType = propertyInfo.PropertyType;      //Convert.ChangeType does not handle conversion to nullable types     //if the property type is nullable, we need to get the underlying type of the property     var targetType = IsNullableType(propertyType) ? Nullable.GetUnderlyingType(propertyType) : propertyType;      //Returns an System.Object with the specified System.Type and whose value is     //equivalent to the specified object.     propertyVal = Convert.ChangeType(propertyVal, targetType);      //Set the value of the property     propertyInfo.SetValue(inputObject, propertyVal, null);  } private static bool IsNullableType(Type type) {     return type.IsGenericType && type.GetGenericTypeDefinition().Equals(typeof(Nullable<>)); }   you need to convert value like this i.e you need to convert value to your property type like as below
PropertyInfo info = t.GetProperty("Value"); object value = null; try  {      value = System.Convert.ChangeType(123,          Nullable.GetUnderlyingType(info.PropertyType)); }  catch (InvalidCastException) {     return; } propertyInfo.SetValue(obj, value, null);   you need to do this because you cannot convert any arbirtary value to given type...so you need to convert it like this
When you write:
obj.Value = v;   the compiler knows how to do the proper casting for you and actually compiles
obj.Value = new long?((long) v);   When your use reflection there is no compiler to help you.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With