我使用此代码
获取对象的子属性PropertyDescriptorCollection childProperties = TypeDescriptor.GetProperties(theObject)[childNode.Name] .GetChildProperties();
认为“theObject”变量是一个TextBox,我尝试设置TextBox.Font.Bold = true;
我将此代码用于主要属性,当我为主要属性进行自定义时,它可以正常工作。但是当我访问子属性时,
我收到一个错误,即“对象引用未设置为对象的实例。”。
foreach (PropertyDescriptor childProperty in childProperties)
{
foreach (XmlAttribute attribute in attributes)
{
if (childProperty.Name == attribute.Name)
{
if (!childProperty.IsReadOnly)
{
object convertedPropertyValue = ConverterHelper.ConvertValueForProperty(attribute.Value, childProperty);
childProperty.SetValue(theObject, convertedPropertyValue); //exception throw here
break;
}
}
}
}
答案 0 :(得分:2)
看起来你正在将错误的对象传递给SetValue
- 从它的表面看起来你会得到类似的东西:
<TextBox>
<Font Bold="true"/>
</Textbox>
然后您获得文本框的Font
属性和字体的Bold
属性,然后尝试将值true
分配给Bold
属性TextBox
。显然这不会起作用。
也许是这样的:
PropertyDescriptor objProp = TypeDescriptor.GetProperties(theObject)[childNode.Name];
PropertyDescriptorCollection childProperties = objProp.GetChildProperties();
foreach (PropertyDescriptor childProperty in childProperties) {
foreach (XmlAttribute attribute in attributes) {
if (childProperty.Name == attribute.Name && !childProperty.IsReadOnly) {
Object convertedPropertyValue = converterHelper.ConvertValueForProperty(attribute.Value, childProperty);
childProperty.SetValue(objProp.getValue(theObject), convertedPropertyValue);
}
}
}
请注意,设置子对象属性的上下文是子对象,而不是父对象。