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 に答える