12

有没有办法通过 c# 中的反射在数组属性中设置单个值?

我的财产是这样定义的:

double[]    Thresholds      { get; set; }

对于“正常”属性,我使用此代码通过反射设置它:

PropertyInfo pi = myObject.GetType().GetProperty(nameOfPropertyToSet);
pi.SetValue(myObject, Convert.ChangeType(valueToSet, pi.PropertyType), null);

我将如何更改此代码以在任意位置设置数组属性中的值?谢谢!

顺便说一句:我尝试使用 index 参数,但这似乎只适用于索引属性,而不是数组属性......

4

3 回答 3

20

当你这样做时:

obj.Thresholds[i] = value;

这在语义上等同于:

double[] tmp = obj.Thresholds;
tmp[i] = value;

SetValue 这意味着您根本不想要 a ;相反,您想使用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

于 2012-03-20T08:06:00.803 回答
7

您实际上并没有设置属性,只是更改了属性值:

object value = myObject.GetType().GetProperty(nameOfPropertyToset).GetValue(myObject, null);

if (value is Array)
{
    Array arr = (Array)value;
    arr.SetValue(myValue, myIndex);
}
else
{
    ...
}
于 2012-03-20T08:05:28.377 回答
0

这里的代码适用于它,它的设计是填充一个 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));
    }
于 2016-11-16T00:16:49.607 回答