2010-03-06 63 views
3

好了,所以我玩了幾個小時左右無果後,我建立了一個模型:屬性在C#創建領域

[AttributeUsage(AttributeTargets.All)] 
public class PublicAttribute : System.Attribute 
{ 
    public enum Access { Public, Private } 
    public PublicAttribute(string Name, Access acs) 
    { 
    } 
    public PublicAttribute(string Name, Access acs, Action get, Action set) 
    { 
    } 
} 

所以,如果有人是做這樣的事情:

[Public("PublicProperty", PublicAttribute.Access.Public)] 
private string PrivateProperty = "hello"; 

[Public("PublicProperty", PublicAttribute.Access.Public,()=>{return PrivateProperty;},()=>{PrivateProperty = value})] 
private string PrivateProperty = "hello"; 

,然後,如果有人試圖訪問PrivateProperty,他們可能只是去:

ContainingClass.PublicProperty = // ect

「PublicProperty」。這是因爲屬性,它會使用這些get/set訪問器。

我想知道些什麼:

  1. 這甚至可能嗎?
  2. 有沒有東西已經做到了這一點?
  3. 如果可能的話(即使有別的東西)我該怎麼做?

回答

4

基本上沒有3,因爲C#是強類型語言。即使用鴨子打字,你想要達到的效果也不符合語言。

您編寫的屬性允許您查詢在類中具有這些屬性的屬性,但仍需要使用Reflection來發現設置屬性類的哪些屬性。您想要使用的語法在編譯時處檢查

0

微軟的方式讓人想起你試圖描述使得它代表比C#public更多的權限是什麼讓WebMethodAttribute,有效地使整個Internet中可用的應用程序域之外的方法(很全局範圍) 。您可能會閱讀它以獲得真正的實施見解和想法。

但是你打的很簡單。你將不得不編程一些基礎設施來使其工作。這不是自動的,你無法訪問所有細節的微軟源代碼。

+0

WebMethodAttribute有點不同。它指示Web服務路由基礎設施爲該方法展示SOAP操作。它實際上並沒有在類上創建額外的編譯時成員(在sniperX的情況下是一個屬性)。 – itowlson 2010-03-06 02:21:18

1

不,這是不可能的使用屬性。屬性是C#編譯器發出的類元數據的一部分,C#編譯器不考慮自定義屬性。

您可能可以通過使用PostSharp等後處理程序來完成此操作,PostSharp可以在事後重寫您的程序集,並且可以指示考慮自定義屬性。但是,您仍然無法在屬性中包含委託:可以存儲在屬性狀態中的一組類型非常有限。

+0

我覺得'ContainingClass。PublicProperty = // ect'仍然無法編譯,即使使用AOP後編譯器 – 2010-03-06 02:20:54

+0

說了這麼一句,+1作爲postsharp可能是他之後的 – 2010-03-06 02:23:23

+0

取決於PostSharp是否能夠發出其他屬性,而不僅僅是重寫現有的方法。我不太瞭解PostSharp是否知道它是否是它的一部分,但是沒有任何技術上的原因,後期編譯器無法做到這一點。 – itowlson 2010-03-06 02:23:23