簡體   English   中英

通過反射設置數組中的值

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM