我想知道如何在运行时更改DisplayNameAttribute,当我进行一些转换时,我希望displayName在我的属性网格中是Feet而不是Meters,这可能吗?
[DisplayName("Meters")]
public double Distance
{
get{return distance;}
}
答案 0 :(得分:12)
有许多不同的方法可以做到这一点。最简单的是做一些类似于某些i18n产品的做法 - 将属性子类化并截取文本;但这仅在您拥有类型时才有效,并且从属性中无法访问上下文。
接下来要看的是TypeConverter
,因为它提供了对属性的组件模型视图的访问,并且比下两个选项更简单;-p这将适用于{{1} },但不是PropertyGrid
等。
列表中的下一个是DataGridView
- 不是一个有趣的界面,但您可以交换自己的属性描述符。这要求您拥有该类型(以便提供接口支持)。
最后,ICustomTypeDescriptor
就像最后一样,但即使对于您不拥有的类型也是如此,并且允许在类型和对象上访问调整后的元数据 level(其他一切只支持 object )。
选择哪个?我怀疑CustomTypeDescriptor
是最明智的;你需要对象上下文(子类属性没有提供),但你不需要额外的复杂性。
这是一个例子;请注意,在TypeConverter
代码中,我们可以访问对象上下文。如果名称很简单,那么将它放在TypeConverter
(创建属性时)就足够了。
TypeConverter
答案 1 :(得分:0)
属性被编译为类型的一部分,因此不能在运行时更改它们。
另一种解决方案可能是确定您始终存储所有值的内部计量单位。米是一个很好的候选人。然后创建位于您的消费者类和原始类之间的“翻译”服务,该类负责将所有值转换为不同的格式。
答案 2 :(得分:0)
在显示名称中设置单位有点奇怪,但如果这确实是您想要做的,那么您唯一的解决方案是使用自定义PropertyDescriptors发布您的属性(感谢TypeConverter或自定义类型描述符)并覆盖DisplayName属性。
答案 3 :(得分:0)
我不知道这是否有效,但您的DisplayName是一个属性。每个类和每个类的成员都可以设置属性。也就是说,PropertyInfo会让您访问此属性。现在,如果你走这条路,来到PropertyInfo.GetCustomAttributes()或类似的东西,并且你检索你的属性值,你说这是只读的,就像你对尼克说的那样吗?
答案 4 :(得分:0)
如果displayname属性已存在(如此情况)并且您只想更改名称,则可以使用此属性的propertydescriptor。只需查看属性属性,直到找到属性并更改值。