Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#属性属性_C#_Properties_Attributes - Fatal编程技术网

C#属性属性

C#属性属性,c#,properties,attributes,C#,Properties,Attributes,我看到了以下代码: [DefaultValue(100)] [Description("Some descriptive field here")] public int MyProperty{...} 上述snipbit的功能似乎足够清晰,我不知道如何使用它来做有用的事情。我甚至不知道该给它取什么名字 有人知道我在哪里可以找到关于这些属性的更多信息/教程吗? 我还对该功能可以完成的任何新颖/有用的任务感兴趣。这些属性可定制设计时体验 可视化设计器(即MS Expression Blend和

我看到了以下代码:

[DefaultValue(100)]
[Description("Some descriptive field here")]
public int MyProperty{...} 
上述snipbit的功能似乎足够清晰,我不知道如何使用它来做有用的事情。我甚至不知道该给它取什么名字

有人知道我在哪里可以找到关于这些属性的更多信息/教程吗?
我还对该功能可以完成的任何新颖/有用的任务感兴趣。

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


可视化设计器(即MS Expression Blend和visual Studio designer)使用示例中的选项在设计器UI中给出提示

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

如果出于某种原因希望访问这些属性,则必须访问


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

它们被称为属性,msdn中有很多信息,例如

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

从上面的功能 snippit看起来很清楚


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

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


要添加您自己的特殊处理,您可以使用;有很多使用PostSharp进行AOP操作的好例子,比如日志记录,或者只是代码简化,比如使用。

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

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

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

这是两个地方使用的信息

1) 当设计器创建命令列表时,它使用CompositeMetaData 显示有关该命令的详细信息

2) 当用户向设计器添加命令并由设计器创建 该类的一个实例,它查看CompositedDesigner属性, 创建指定类型(usercontrol)的新实例并将其添加 给视觉设计师

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

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

至于加载设计器,该属性如下所示:

var designerAttribute = (CompositeDesignerAttribute)item.CompositType.GetCustomAttributes(false)
                         .Where(a => a.GetType() == typeof(CompositeDesignerAttribute)).FirstOrDefault();
这只是如何使用自定义属性的一个示例


我希望这能为您提供一个起点。

它们也在Visual Studio designer中使用。需要注意的是,它们只是提示:例如,在代码中,您仍然必须将MyPoperty的默认值设置为100,否则最终会对属性的消费者撒谎。因此,如果我没有显式地将MyProperty设置为另一个值,表单设计器(或同等)会在后台将MyProperty设置为100?否!如果不将MyProperty显式设置为值,它将默认为0(假定为后备存储)。表单设计器将该值显示为“0”,但粗体显示,表示已从默认值手动更改为。如果仅影响表单设计器中值的外观。
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);
    }                           
}
var designerAttribute = (CompositeDesignerAttribute)item.CompositType.GetCustomAttributes(false)
                         .Where(a => a.GetType() == typeof(CompositeDesignerAttribute)).FirstOrDefault();