2008-10-16 136 views
14

我看到了下面的代碼:C#屬性的屬性

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

從上面的這段功能似乎很清楚,我不知道,我怎麼可以用它做有用的事情。我什至不知道給什麼名字!

有沒有人知道我可以找到更多的信息/這些屬性屬性的教程? 我也會對這個功能可以做的任何新穎/有用的任務感興趣。

回答

13

人們已經介紹了UI方面 - 屬性有其他用途,儘管...例如,它們廣泛用於大多數序列化框架。 某些屬性由編譯器給予特殊處理 - 例如,[PrincipalPermission(...)]爲方法添加了聲明性安全性,允許您(自動)檢查用戶是否具有適當的訪問權限。

要添加您自己的特殊處理,您可以使用PostSharp;有很多很好的使用PostSharp來做AOP的例子,比如日誌記錄 - 或者只是代碼簡化,比如automatic INotifyPropertyChanged implementation

6

在你的實施例中的那些是通過使用可視化設計(即MS Expression Blend和Visual Studio設計),得到在設計UI提示。

請注意,它們是元數據,不會影響屬性邏輯。例如,設置DefaultValue默認情況下不會將該屬性設置爲該值,您必須手動執行此操作。

如果由於某種原因想要訪問這些屬性,則必須use reflection

有關設計師屬性的更多信息,請參閱MSDN

+0

它們也用於Visual Studio設計器。 – 2008-10-16 14:08:18

+0

重要的是要注意,它們只是提示:例如,您仍然必須在代碼中將MyPoperty的默認值設置爲100,否則最終會對您的財產消費者說謊。 – 2008-10-16 14:09:20

6

它們被稱爲屬性,在msdn中有很多信息,例如, http://msdn.microsoft.com/en-us/library/z0w1kczw.aspx

一般而言,他們不會自己「做」任何事情,他們被其他一些會使用您的班級的代碼使用。 XmlSerialization就是一個很好的例子:XmlSerializer(由Microsoft作爲框架的一部分提供)幾乎可以用於任何類(儘管對類有許多要求) - 它使用反射來查看類中包含的數據。您可以使用屬性(與XmlSerializer一起定義)來更改XmlSerializer將序列化您的類的方式(例如,告訴它將數據保存爲屬性而不是元素)。

27

從上面 的這段功能似乎很清楚,

也許不是,因爲很多人認爲[默認值()] 屬性的值。實際上,它只是告訴一些視覺設計師(例如Visual Studio),代碼將設置默認值。這樣它就知道大膽如果它被設置爲別的東西,屬性窗口中的值。

3

我們使用它來定義應加載哪個圖形設計器來配置特定類型的實例 。

也就是說,我們有一種工作流設計器,它從程序集加載所有可能的命令 類型。這些命令類型具有需要配置的屬性,因此每個命令類型都需要不同的設計器(用戶控件)。

例如,考慮下面的命令類型(稱爲複合在我們的解決方案)

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

這信息在兩個地方

1)當使用時的設計者創建命令列表,它使用CompositeMetaData 來顯示有關該命令的更多信息。

2)當用戶將命令給設計者和設計者創建 那個類的一個實例,它看起來在CompositeDesigner屬性, 創建指定的類型(用戶控件)的一個新實例,並增加了它 到視覺設計師。

考慮下面的代碼中,我們使用的命令加載到我們的「工具欄」:

正如你所看到的,在裝配每一種類型,其名稱爲「複合」, 結束我們獲得自定義屬性並使用該信息來填充我們的ToolboxListItem實例。

至於加載設計,屬性retreived這樣的:

var designerAttribute = (CompositeDesignerAttribute)item.CompositType.GetCustomAttributes(false) 
         .Where(a => a.GetType() == typeof(CompositeDesignerAttribute)).FirstOrDefault(); 

這只是其中的一個,你如何能夠使用自定義屬性例如,

我希望這給你一個開始的地方。