我见过以下代码:

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

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

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

有帮助吗?

解决方案

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

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

其他提示

  

以上功能   snippit看起来很清楚,

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

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

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

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

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

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

一般来说,他们并不“做”。任何他们自己的东西,它们都会被其他一些使用你的类的代码所使用。 XmlSerialization是一个很好的例子:XmlSerializer(由Microsoft作为框架的一部分提供)几乎可以是任何类(虽然在类上有许多要求) - 它使用反射来查看类中包含的数据。您可以使用属性(与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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top