Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Type conversion issue when setting property through reflection

Tags:

c#

reflection

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?

like image 508
Shikyo Avatar asked Nov 07 '12 12:11

Shikyo


2 Answers

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

like image 171
Pranay Rana Avatar answered Sep 18 '22 07:09

Pranay Rana


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.

like image 31
fsimonazzi Avatar answered Sep 21 '22 07:09

fsimonazzi