C#属性属性

我看过以下代码:

[DefaultValue(100)] [Description("Some descriptive field here")] public int MyProperty{...} 

上面的snippit的function似乎很清楚,我不知道如何使用它来做有用的事情。 我甚至不确定给它的名字!

有谁知道我在哪里可以找到更多关于这些属性属性的信息/教程? 我也对这个function可以做的任何新颖/有用的任务感兴趣。

人们已经涵盖了UI方面 – 属性有其他用途,但是……例如,它们在大多数序列化框架中被广泛使用。 某些属性由编译器给予特殊处理 – 例如, [PrincipalPermission(...)]为方法添加声明性安全性,允许您(自动)检查用户是否具有适当的访问权限。

要添加自己的特殊处理,可以使用PostSharp ; 有许多很好的例子可以使用PostSharp来执行AOP操作,例如日志记录 – 或者只是简单的代码简化,例如使用自动INotifyPropertyChanged实现 。

上面的snippit的function似乎很清楚,

也许不是,因为许多人认为[DefaultValue()] 设置了属性的值。 实际上,它只是告诉一些视觉设计师(例如Visual Studio),代码将默认值设置为什么。 这样它就知道如果将其设置为其他内容,则在属性窗口中加粗值。

您的示例中的那些由可视化设计器(即MS Expression Blend和Visual Studio设计器)使用,以在设计器UI中提供提示。

请注意,它们是元数据,不会影响属性逻辑。 例如,设置DefaultValue不会将该属性设置为默认值,您必须手动执行此操作。

如果由于某种原因想要访问这些属性,则必须使用reflection 。

有关设计器属性的更多信息,请参阅MSDN 。

它们被称为属性,msdn中有很多信息,例如http://msdn.microsoft.com/en-us/library/z0w1kczw.aspx

一般来说,他们不会自己“做”任何事情,但是其他代码会使用你的类。 XmlSerialization是一个很好的例子:XmlSerializer(由Microsoft作为框架的一部分提供)几乎可以是任何类(虽然在类上有许多要求) – 它使用reflection来查看类中包含的数据。 您可以使用属性(与XmlSerializer一起定义)来更改XmlSerializer序列化类的方式(例如,告诉它将数据保存为属性而不是元素)。

我们使用它来定义应该加载哪个图形设计器来配置特定类型的实例。

也就是说,我们有一种工作流设计器,它从一个程序集中加载所有可能的命令类型。 这些命令类型具有需要配置的属性,因此每个命令类型都需要不同的设计器(usercontrol)。

例如,考虑以下命令类型(在我们的解决方案中称为复合)

 [CompositeMetaData("Delay","Sets the delay between commands",1)] [CompositeDesigner(typeof(DelayCompositeDesigner))] public class DelayComposite : CompositeBase { // code here } 

这是在两个地方使用的信息

1)当设计者创建命令列表时,它使用CompositeMetaData显示有关命令的更多信息。

2)当用户向设计器添加命令并且设计者创建该类的实例时,它会查看CompositeDesigner属性,创建指定类型的新实例(usercontrol)并将其添加到可视设计器中。

考虑以下代码,我们用来将命令加载到我们的“工具栏”中:

 foreach (Type t in assembly.GetExportedTypes()) { Console.WriteLine(t.Name); if (t.Name.EndsWith("Composite")) { var attributes = t.GetCustomAttributes(false); ToolboxListItem item = new ToolboxListItem(); CompositeMetaDataAttribute meta = (CompositeMetaDataAttribute)attributes .Where(a => a.GetType() == typeof(Vialis.LightLink.Attributes.CompositeMetaDataAttribute)).First(); item.Name = meta.DisplayName; item.Description = meta.Description; item.Length = meta.Length; item.CompositType = t; this.lstCommands.Items.Add(item); } } 

如您所见,对于名称以“Composite”结尾的程序集中的每个类型,我们获取自定义属性并使用该信息填充ToolboxListItem实例。

至于加载设计器,属性是这样检索的:

 var designerAttribute = (CompositeDesignerAttribute)item.CompositType.GetCustomAttributes(false) .Where(a => a.GetType() == typeof(CompositeDesignerAttribute)).FirstOrDefault(); 

这只是您可以使用自定义属性的一个示例,

我希望这能给你一个开始的地方。

这些属性可自定义设计时体验。

http://msdn.microsoft.com/en-us/library/a19191fh.aspx