[英]Setting value in an array via reflection
有没有办法通过c#中的反射在数组属性中设置单个值?
我的属性定义如下:
double[] Thresholds { get; set; }
对于“普通”属性,我使用此代码通过反射设置它:
PropertyInfo pi = myObject.GetType().GetProperty(nameOfPropertyToSet);
pi.SetValue(myObject, Convert.ChangeType(valueToSet, pi.PropertyType), null);
我如何更改此代码以将数组属性中的值设置在任意位置? 谢谢!
顺便说一句:我试图使用索引参数,但这似乎只适用于索引属性,而不是数组属性...
当你这样做时:
obj.Thresholds[i] = value;
这在语义上等同于:
double[] tmp = obj.Thresholds;
tmp[i] = value;
这意味着你不想要SetValue
可言 ; 相反,你想使用GetValue
来获取数组,然后改变数组。 如果已知类型为double[]
,则:
double[] arr = (double[]) pi.GetValue(myObject, null);
arr[i] = value;
否则可能是非通用的IList
方法(因为数组实现了IList
):
IList arr = (IList) pi.GetValue(myObject, null);
arr[i] = value;
如果它是一个多维数组,你将不得不使用Array
代替IList
。
您实际上并没有设置属性,只是更改属性值:
object value = myObject.GetType().GetProperty(nameOfPropertyToset).GetValue(myObject, null);
if (value is Array)
{
Array arr = (Array)value;
arr.SetValue(myValue, myIndex);
}
else
{
...
}
这里的代码将适用于它,它的设计填充10位数组,你可以为任何大小的数组。
PopulateInstance函数用我需要的东西填充数据结构。
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));
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.