31

メソッドを使用して、リフレクションでオブジェクト プロパティ値を設定しようとしていますpropertyInfo.SetValue()が、「オブジェクトがターゲット タイプと一致しません」という例外が発生します。文字列置換値を使用してオブジェクトに単純な文字列プロパティを設定しようとしているだけなので、(少なくとも私には!) 本当に意味がありません。コード スニペットは次のとおりです。これは再帰関数内に含まれているため、さらに多くのコードがありますが、これが要点です。

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

fieldPropertyInfo.SetValue(businessObject, replacementValue, null);

businessObject" andtrue を返したこの比較を行うことで、 replacementValue` が両方とも同じ型であることを確認しました。

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

3 に答える 3

33

propertyinfo 値の値を設定しようとしています。上書きするから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);

次のようになります。

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);
于 2013-09-30T18:34:21.713 に答える