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