2012-03-20 5 views
9

C#에서 리플렉션을 통해 배열 속성에 단일 값을 설정하는 방법이 있습니까?리플렉션을 통해 배열의 값 설정

내 속성을 다음과 같이 정의된다 :

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

내가 설정하려면이 코드를 변경해야 할 것입니다 방법 : 나는 반사를 통해 그것을 설정하려면이 코드를 사용하여 "정상"속성에 대한

double[] Thresholds  { get; set; } 

임의의 위치의 배열 프로퍼티의 값 감사합니다.

은 BTW : 나는 인덱스 매개 변수를 사용하려고하지만 당신은 실제로 속성을 설정 단지 속성 값을 변경하지 않습니다 ... 인덱스 속성이 아닌 배열 인 속성에 대한

답변

15

당신이 할 경우 :

:에 의미와 동일

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; 

을가 다차원 배열 인 경우, IList 대신 Array을 사용해야합니다.

5

작업 만 보인다

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

if (value is Array) 
{ 
    Array arr = (Array)value; 
    arr.SetValue(myValue, myIndex); 
} 
else 
{ 
    ... 
} 
+1

"속성 값 변경"은 "속성 설정"(직접 또는 간접적으로)과 동의어이므로 혼동을 일으킬 수 있습니다. 사실, 여기서 속성 값 **은 절대로 변경되지 않습니다 ** (같은 참조); 변경되는 배열 내용입니다. 또한, 'GetValue'는 여기에 두 번째 매개 변수가 필요합니다. –

+0

GetValue가 고정되었습니다. – bluish

0

여기에 Te 코드가 적용되어 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)); 
    }