如何在运行时更改DisplayNameAttribute以在Property Grid C#中使用

时间:2010-03-10 21:47:07

标签: c# propertygrid

我想知道如何在运行时更改DisplayNameAttribute,当我进行一些转换时,我希望displayName在我的属性网格中是Feet而不是Meters,这可能吗?

[DisplayName("Meters")]
public double Distance
  {
     get{return distance;}
  }

5 个答案:

答案 0 :(得分:12)

有许多不同的方法可以做到这一点。最简单的是做一些类似于某些i18n产品的做法 - 将属性子类化并截取文本;但这仅在您拥有类型时才有效,并且从属性中无法访问上下文。

接下来要看的是TypeConverter,因为它提供了对属性的组件模型视图的访问,并且比下两个选项更简单;-p这将适用于{{1} },但不是PropertyGrid等。

列表中的下一个是DataGridView - 不是一个有趣的界面,但您可以交换自己的属性描述符。这要求您拥有该类型(以便提供接口支持)。

最后,ICustomTypeDescriptor就像最后一样,但即使对于您不拥有的类型也是如此,并且允许在类型对象上访问调整后的元数据 level(其他一切只支持 object )。

选择哪个?我怀疑CustomTypeDescriptor是最明智的;你需要对象上下文(子类属性没有提供),但你不需要额外的复杂性。

这是一个例子;请注意,在TypeConverter代码中,我们可以访问对象上下文。如果名称很简单,那么将它放在TypeConverter(创建属性时)就足够了。

TypeConverter

答案 1 :(得分:0)

属性被编译为类型的一部分,因此不能在运行时更改它们。

另一种解决方案可能是确定您始终存储所有值的内部计量单位。米是一个很好的候选人。然后创建位于您的消费者类和原始类之间的“翻译”服务,该类负责将所有值转换为不同的格式。

答案 2 :(得分:0)

在显示名称中设置单位有点奇怪,但如果这确实是您想要做的,那么您唯一的解决方案是使用自定义PropertyDescriptors发布您的属性(感谢TypeConverter或自定义类型描述符)并覆盖DisplayName属性。

此处也回答:Change DisplayName attribute for a property

答案 3 :(得分:0)

我不知道这是否有效,但您的DisplayName是一个属性。每个类和每个类的成员都可以设置属性。也就是说,PropertyInfo会让您访问此属性。现在,如果你走这条路,来到PropertyInfo.GetCustomAttributes()或类似的东西,并且你检索你的属性值,你说这是只读的,就像你对尼克说的那样吗?

答案 4 :(得分:0)

如果displayname属性已存在(如此情况)并且您只想更改名称,则可以使用此属性的propertydescriptor。只需查看属性属性,直到找到属性并更改值。