我看到了以下代码:
[DefaultValue(100)]
[Description("Some descriptive field here")]
public int MyProperty{...}
从上面的片段来看,其功能似乎已经很清晰了,但我不知道如何利用它来做有用的事情。我甚至不确定该给它什么名称!
有人知道在哪里可以找到更多关于这些属性特性的信息/教程吗?我也对此功能能够完成的任何新颖/有用任务感兴趣。
我看到了以下代码:
[DefaultValue(100)]
[Description("Some descriptive field here")]
public int MyProperty{...}
从上面的片段来看,其功能似乎已经很清晰了,但我不知道如何利用它来做有用的事情。我甚至不确定该给它什么名称!
有人知道在哪里可以找到更多关于这些属性特性的信息/教程吗?我也对此功能能够完成的任何新颖/有用任务感兴趣。
从上面的片段中,功能似乎很清楚
但实际上,很多人认为[DefaultValue()] 设置 属性的值。其实它只是告诉一些视觉设计器(如Visual Studio),代码将把默认值设为什么。这样它就知道如果属性被设置为其他值,则在属性窗口中将其加粗显示。
人们已经涵盖了UI方面 - 属性还有其他用途,例如它们在大多数序列化框架中被广泛使用。
一些属性被编译器赋予特殊处理 - 例如,[PrincipalPermission(...)]
将声明性安全性添加到方法中,允许您(自动)检查用户是否具有适当的访问权限。
要添加自己的特殊处理,可以使用PostSharp;有许多很好的示例,可用PostSharp来执行AOP操作,如记录日志 - 或者只是代码简化,比如使用自动实现INotifyPropertyChanged
。
[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();