2013-09-30 3 views
11

propertyInfo.SetValue() 메서드를 사용하여 리플렉션으로 개체 속성 값을 설정하려고하는데 "개체가 대상 형식과 일치하지 않습니다."예외가 발생합니다. 문자열 대체 값이있는 객체에 간단한 문자열 속성을 설정하려고 할 때 실제로 의미가 없습니다 (적어도 나에게!). 여기에 코드 조각입니다 - 이것은 무리 많은 코드가 그래서 재귀 함수에 포함됩니다 만,이 용기입니다 : 그 "businessObject"와 "replacementValue"을 확인한C# Reflection - 개체가 대상 형식과 일치하지 않습니다.

PropertyInfo fieldPropertyInfo = businessObject.GetType().GetProperties().FirstOrDefault(f => f.Name.ToLower() == piecesLeft[0].ToLower()); 
businessObject = fieldPropertyInfo.GetValue(businessObject, null); 

fieldPropertyInfo.SetValue(businessObject, replacementValue, null); 

은 모두 같은 타입으로되어 당신은 businessObject의 유형, 해당 속성 아닌 유형의 다른 값으로 businessObject에 속성 값을 설정하려는

businessObject.GetType() == replacementValue.GetType() 

답변

17

propertyinfo 값의 값을 설정하려고합니다. 명확하고 간결한 코드 샘플을 주셔서 감사합니다 -

PropertyInfo fieldPropertyInfo = businessObject.GetType().GetProperties() 
           .FirstOrDefault(f => f.Name.ToLower() == piecesLeft[0].ToLower()); 

// also you should check if the propertyInfo is assigned, because the 
// given property looks like a variable. 
if(fieldPropertyInfo == null) 
    throw new Exception(string.Format("Property {0} not found", f.Name.ToLower())); 

// you are overwriting the original businessObject 
var businessObjectPropValue = fieldPropertyInfo.GetValue(businessObject, null); 

fieldPropertyInfo.SetValue(businessObject, replacementValue, null); 
+0

빙고 : 당신이 businessObject

PropertyInfo fieldPropertyInfo = businessObject.GetType().GetProperties() .FirstOrDefault(f => f.Name.ToLower() == piecesLeft[0].ToLower()); // The result should be stored into another variable here: businessObject = fieldPropertyInfo.GetValue(businessObject, null); fieldPropertyInfo.SetValue(businessObject, replacementValue, null); 

을 덮어하고 있기 때문에 뭔가를해야합니다. 감사! –

3

: 사실 반환이 비교를하고.

이 코드가 작동하려면 으로 정의 된 필드와 동일한 유형이어야하고 분명히 해당 유형이 아니어야합니다.

4

두 번째 줄을 제거하고 싶다고 생각됩니다. 어쨌든 거기서 뭐하는거야? 속성 의 값을에서 가져오고 businessObject이라는 객체를 가져 와서 그 값을 businessObject으로 설정합니다. 그래서 이것이 실제로 문자열 속성이라면, businessObject의 값은 나중에 문자열 참조가 될 것입니다. 그리고 그 값을 속성의 대상으로 사용하려고합니다! 다음과 같이하는 것이 좋습니다.

dynamic businessObject = ...; 
businessObject = businessObject.SomeProperty; // This returns a string, remember! 
businessObject.SomeProperty = replacementValue; 

그럴 수는 없습니다.

그것은 무엇 replacementValue 분명하지 않다 -는 대체 문자열 또는에서 실제 대체 값을 가져 오기 위해 비즈니스 오브젝트가 있는지 여부,하지만 난 당신이 중 하나를 원하는 의심 :

PropertyInfo fieldPropertyInfo = businessObject.GetType().GetProperties() 
     .FirstOrDefault(f => f.Name.ToLower() == piecesLeft[0].ToLower()); 
fieldPropertyInfo.SetValue(businessObject, replacementValue, null); 

또는 :

PropertyInfo fieldPropertyInfo = businessObject.GetType().GetProperties() 
     .FirstOrDefault(f => f.Name.ToLower() == piecesLeft[0].ToLower()); 
object newValue = fieldPropertyInfo.GetValue(replacementValue, null); 
fieldPropertyInfo.SetValue(businessObject, newValue, null); 
관련 문제