我看到了以下代码:
[DefaultValue(100)]
[Description("Some descriptive field here")]
public int MyProperty{...}
上面的功能似乎足够清晰,我不知道如何使用它来做有用的事情。我甚至不知道该给它取什么名字!
有人知道我在哪里可以找到关于这些属性的更多信息/教程吗?我也对这个功能可以完成的任何新颖/有用的任务感兴趣。
上述功能狙击坑似乎足够清楚,
也许不是,因为很多人认为[DefaultValue()]设置属性的值。实际上,它所做的只是告诉一些可视化设计器(例如visual Studio),代码将把默认值设置为什么。这样,它就知道如果属性窗口中的值被设置为其他值,就可以bold。
人们已经涵盖了UI方面-属性还有其他用途。。。例如,它们在大多数序列化框架中被广泛使用。编译器会对某些属性进行特殊处理——例如,[PrincipalPermission(...)]
为方法添加声明性安全性,允许您(自动)检查用户是否具有适当的访问权限。
要添加您自己的特殊处理,您可以使用PostSharp;有很多使用PostSharp做AOP的好例子,比如日志记录,或者只是代码简化,比如使用自动INotifyPropertyChanged
实现。
它们被称为属性,msdn中有很多信息,例如。http://msdn.microsoft.com/en-us/library/z0w1kczw.aspx
一般来说,它们不会自己"做"任何事情,而是由其他将使用您的类的代码使用。XmlSerialization就是一个很好的例子:XmlSerializer(由Microsoft作为框架的一部分提供)几乎可以是任何类(尽管对该类有很多要求)-它使用反射来查看类中包含哪些数据。您可以使用属性(与XmlSerializer一起定义)来更改XmlSerialize器序列化类的方式(例如,告诉它将数据保存为属性而不是元素)。
可视化设计器(即MS Expression Blend和visual Studio设计器)使用示例中的那些来在设计器UI中提供提示。
请注意,它们是元数据,不会影响属性逻辑。例如,默认情况下,设置DefaultValue
不会将属性设置为该值,您必须手动执行此操作。
如果出于某种原因想要访问这些属性,则必须使用反射。
有关设计器属性的详细信息,请参阅MSDN。
我们使用它来定义应该加载哪个图形设计器来配置特定类型的实例。
也就是说,我们有一种工作流设计器,它加载所有可能的命令类型。这些命令类型具有需要配置的属性,因此,每种命令类型都需要一个不同的设计器(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