C# 通过反射在数组中设置值

C# 通过反射在数组中设置值,c#,arrays,reflection,propertyinfo,setvalue,C#,Arrays,Reflection,Propertyinfo,Setvalue,有没有办法通过c#中的反射在数组属性中设置单个值 我的属性定义如下: double[] Thresholds { get; set; } 对于“正常”属性,我使用以下代码通过反射进行设置: PropertyInfo pi = myObject.GetType().GetProperty(nameOfPropertyToSet); pi.SetValue(myObject, Convert.ChangeType(valueToSet, pi.PropertyType), null

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

我的属性定义如下:

double[]    Thresholds      { get; set; }
对于“正常”属性,我使用以下代码通过反射进行设置:

PropertyInfo pi = myObject.GetType().GetProperty(nameOfPropertyToSet);
pi.SetValue(myObject, Convert.ChangeType(valueToSet, pi.PropertyType), null);
如何更改此代码以将数组属性中的值设置在任意位置? 谢谢


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

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

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

if (value is Array)
{
    Array arr = (Array)value;
    arr.SetValue(myValue, myIndex);
}
else
{
    ...
}
当您这样做时:

obj.Thresholds[i] = value;
语义上等同于:

double[] tmp = obj.Thresholds;
tmp[i] = value;
这意味着您根本不需要
设置值
;相反,您希望使用
GetValue
获取数组,然后对数组进行变异。如果已知类型为
double[]
,则:

double[] arr = (double[]) pi.GetValue(myObject, null);
arr[i] = value;
否则,可能是非泛型的
IList
方法(因为数组实现了
IList
):


如果它是多维数组,则必须使用
数组
代替
IList
这里的代码将对其起作用,它的设计可以填充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));
    }
objectsingleval;
阵列阵列;
System.Type LocalPType=obj.GetType().GetField(node.Name).FieldType;
if(LocalPType.IsArray)
{
singleval=TreeNodeProperty.CreateNewInstance(LocalPType.GetElementType());
arrayval=Array.CreateInstance(LocalPType,10);
对于(int i=0;i<10;i++)
{
singleval=PopulateInstance(singleval,节点);
arrayval.SetValue(singleval,i);
}
obj.GetType().GetField(node.Name).SetValue(obj,arrayval);
}
其他的
{
对象val;
val=Activator.CreateInstance(LocalPType);
obj.GetType().GetField(node.Name).SetValue(obj,PopulateInstance(val,node));
}
“更改属性值”的措辞令人困惑,因为这是“设置属性”(直接或间接)的同义词。实际上,这里的属性值永远不会改变(它是相同的引用);更改的是数组内容。另外,
GetValue
这里需要第二个参数。
    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));
    }