Is there a way to set a single value in an array property via reflection in c#?
My property is defined like this:
double[] Thresholds { get; set; }
For "normal" properties I use this code to set it via reflection:
PropertyInfo pi = myObject.GetType().GetProperty(nameOfPropertyToSet);
pi.SetValue(myObject, Convert.ChangeType(valueToSet, pi.PropertyType), null);
How would I have to change this code to set the value in an array property at an arbitrary position? Thanks!
BTW: I tried to use the index parameter, but that seems only to work for indexed properties, not properties that are arrays...
When you do:
obj.Thresholds[i] = value;
that is semantically equivalent to:
double[] tmp = obj.Thresholds;
tmp[i] = value;
which means you don't want a SetValue
at all; rather, you want to use GetValue
to obtain the array, and then mutate the array. If the type is known to be double[]
, then:
double[] arr = (double[]) pi.GetValue(myObject, null);
arr[i] = value;
otherwise perhaps the non-generic IList
approach (since arrays implement IList
):
IList arr = (IList) pi.GetValue(myObject, null);
arr[i] = value;
If it is a multi-dimensional array, you'll have to use Array
in place of IList
.
You are not actually setting the property, just changing the property value:
object value = myObject.GetType().GetProperty(nameOfPropertyToset).GetValue(myObject, null);
if (value is Array)
{
Array arr = (Array)value;
arr.SetValue(myValue, myIndex);
}
else
{
...
}
Te code here will work for on it, its design to fill a 10 position array, you can do it for any size array.
The function PopulateInstance populate a data structure with what I need.
object singleval;
Array arrayval;
System.Type LocalPType = obj.GetType().GetField(node.Name).FieldType;
if (LocalPType.IsArray)
{
singleval = TreeNodeProperty.CreateNewInstance(LocalPType.GetElementType());
arrayval = Array.CreateInstance(LocalPType, 10);
for(int i = 0; i < 10; i++)
{
singleval = PopulateInstance(singleval, node);
arrayval.SetValue(singleval, i);
}
obj.GetType().GetField(node.Name).SetValue(obj, arrayval);
}
else
{
object val;
val = Activator.CreateInstance(LocalPType);
obj.GetType().GetField(node.Name).SetValue(obj, PopulateInstance(val, node));
}
来源:https://stackoverflow.com/questions/9783191/setting-value-in-an-array-via-reflection