用反射的方式实现:
public static void SetReadOnlyAttribute(object instance, string propertyName, bool isReadOnly)
{
PropertyDescriptor descriptor = TypeDescriptor.GetProperties(instance)[propertyName];
Type readOnlyType=typeof(ReadOnlyAttribute);
//要求所要设置的属性上必需有标识ReadOnlyAttribute
Attribute readOnly = descriptor.Attributes[readOnlyType];
FieldInfo isReadOnlyField =
readOnlyType.GetField("isReadOnly", BindingFlags.Instance | BindingFlags.CreateInstance | BindingFlags.NonPublic);
isReadOnlyField.SetValue(readOnly, isReadOnly);
}
通过这种方式实现 instance 的类型中的名称为 propertyName 的属性是否只读值设置为isReadOnly;
如果你在PropertyGrid中绑定instance后进行了设定,当同一PropertyGrid又去绑定另一个与instance同类型的对象时,请注意propertyName属性的只读是否需要设定为原来的值,因为上述方法改变的是类型的属性的Attribute的值。