15

我看过以下代码:

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

上面的代码片段的功能似乎很清楚,我不知道如何使用它来做有用的事情。我什至不知道给它起什么名字!

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

4

6 回答 6

27

上面代码片段的功能似乎很清楚,

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

于 2008-10-16T14:11:29.150 回答
13

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

要添加自己的特殊处理,可以使用PostSharp;有很多使用 PostSharp 做 AOP 事情的好例子,比如日志记录——或者只是代码简化,比如自动INotifyPropertyChanged实现

于 2008-10-16T14:14:06.243 回答
7

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

通常,它们不会自己“做”任何事情,它们被其他一些将使用您的类的代码使用。XmlSerialization 就是一个很好的例子:XmlSerializer(由 Microsoft 作为框架的一部分提供)几乎可以用于任何类(尽管对类有很多要求)——它使用反射来查看类中包含哪些数据。您可以使用属性(与 XmlSerializer 一起定义)来更改 XmlSerializer 序列化您的类的方式(例如,告诉它将数据保存为属性而不是元素)。

于 2008-10-16T14:07:42.090 回答
6

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

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

如果您出于某种原因想要访问这些属性,则必须使用反射

有关设计器属性的详细信息,请参阅MSDN

于 2008-10-16T14:07:01.720 回答
3

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

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

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

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

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

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

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

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

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();

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

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

于 2008-10-16T15:08:20.097 回答
2

这些属性定制设计时体验。

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

于 2008-10-16T14:06:26.523 回答