【发布时间】:2015-05-10 11:58:11
【问题描述】:
我有一个带有一堆属性的接口,其中一些属性被定义为只读,例如:
public interface IActivity {
string Id { get; }
bool IsEnabled { get; }
}
实现这个接口的类有公共的set方法,可以在别处使用,但是这个接口的使用者应该不能设置这些属性。我现在正在构建一个测试使用者,并通过 PropertyGrid 控件公开对象。因为它是通过公共 set 方法绑定到类的,所以就消费者而言应该是只读的属性在网格中是可编辑的。
我可以通过两种方式解决此问题,首先通过设置设置器internal,或通过使用[ReadOnly] 属性标记属性,但这似乎并不“正确”,因为理论上其他东西可以实现这个界面不受我的控制,那些所谓的只读属性可以通过属性网格进行更改。
在将对象分配给属性网格时,我尝试显式转换为接口,但这也无济于事:
propGrid.SelectedObject = (IActivity)obj;
有没有办法强制 PropertyGrid 控件遵守接口的约定,而不必更改具体的类?
【问题讨论】:
-
网格可能使用反射来确定它应该显示哪些列以及这些列是否可编辑。由于您传入的对象是允许编辑属性的类型,因此您无能为力。并且将其转换为更受限制的类型也无济于事,因为
SelectedObject无论如何都需要object。 -
是的,这就是我的想法,它必须反映给您可以应用的其他属性来更改网格中的行为。只是希望有一种方法可以强制它遵循界面
标签: c# winforms propertygrid