在控件上使用多个属性特性:
[Browsable(false)]
[Bindable(false)]
[EditorBrowsable(EditorBrowsableState.Never)]
[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
[Obsolete("", true)]
public new Boolean AllowDrop;
我也在许多其他控件属性上使用这些属性。
我想知道是否有一种方法可以减少每次编写的代码量。
如果我能像这样合并多个属性,那就太好了:
[Hidden(true)]
public new Boolean AllowDrop;
其中Hidden
属性将包括上述所有属性。因此只有一行代码。
也许还有一种方法可以在宏或其他东西中合并属性?
我知道还有其他隐藏属性的方法,但我选择了使用属性的方法。
谢谢
2条答案
按热度按时间mkshixfv1#
这取决于使用该属性的框架。
组合属性对于使用和解释属性的上下文可能是有意义的。例如,对于使用.Net类型说明机制的上下文,您可以自定义.Net返回给使用者的type description。
可以使用标准.Net机制为类型提供自定义元数据,为对象注册自定义类型说明符。
这个想法是这样工作的,你为你的类型创建一个自定义类型描述符。在自定义类型描述符中,你为你的类型的属性返回自定义属性描述符,而在属性描述符中,你为属性返回一组自定义属性。
这种方法需要更多的代码,但它确实很有趣,并分享了一些关于如何为类型提供定制元数据的好想法:
I气象数据属性接口
该用法提供了创建MetaDataAttributes的标准方法。实现此接口的每个属性都将用作元数据,并且将使用它在
Process
方法中返回的那些属性,而不是该属性:元数据属性示例
这是一个示例元数据属性,在处理属性时返回某个属性:
属性描述符
此类将由自定义类型说明符用于为属性(Property)提供自定义特性列表:
类型描述符
这是为类型提供自定义描述的类型描述符。在本例中,它使用自定义属性描述符为类的属性提供自定义属性集:
类型描述符提供程序
这个类将被用在你的类型上面的属性中,以引入我们创建的自定义类型描述符作为类型的元数据引擎:
示例类
下面是我的示例类,它的
Name
属性使用MySampleMetadataAttribute
修饰,并且类本身注册为使用我们的自定义类型描述符提供程序:要查看结果,只需创建一个类的示例并在
PropertyGrid
中查看结果:关于答案的一些注解
PropertyGrid
控件,该控件使用类型描述。k2fxgqgv2#
对我来说,最好的方法是使用Metalama(PostSharp为新的.NET版本而进行的现代重写)。它绝对是在.NET中做AOP的最好框架,来自做PostSharp的同一个家伙。它还在预览中,但Metalama 1. 0将在一两周内发布,并在明年,它可能会得到PostSharp中的大部分功能...而且它在Slack上有一个很好的社区,这个Metalama框架的作者非常支持我,他们帮助我解决了我的每个问题,我已经有很多问题了:D
因此,这个库是完美的创建自定义方面,但可以很容易地用于这种属性的合并:)这将是甚至比上面的方法更好,因为一旦你看到转换的文件(使用Metalama比较预览-你必须安装Metalama扩展到VS),那么你实际上会看到所有这些原始属性在那里,在一个转换的文件:)这就是我如何容易地将3个属性合并成1与Metalama:Metalama easy merging of attributes 1(这适用于Metalama创建的方面属性)
或者,对于其他属性(来自其他库),不需要执行方面工作,它将如下所示:(而这很可能是你想要使用的,而不是第一个例子...):