2013-07-10 82 views
10

如果使用其他屬性,我想強制使用屬性。 如果一個特殊的第三方屬性附加到一個屬性,這個屬性也需要給一個屬性 有沒有可能這樣做?強制使用屬性屬性(如果它們已具有其他屬性)

例如:

[Some3rdPartyAttribute("...")] 
[RequiredAttribute("...)] 
public bool Example{get; set;} 

應該讓沒有編譯錯誤,

[Some3rdPartyAttribute("...")] 
public bool Example{get; set;} 

應該把編譯錯誤或警告。

屬性本身的肺癌等從http://msdn.microsoft.com/en-US/library/z919e8tw(v=vs.80).aspx本身的例子。但是,如果使用另一個屬性,如何強制使用該屬性?

回答

2

另一種選擇是使用一些AOP技術。例如像:

PostSharp

使用它你可以編譯分析yur代碼,併發出錯誤,如果某些條件不符合您的要求。

有關屬性的具體的例子,可以一看:

PostSharp 2.1: Reflecting Custom Attributes

+0

我喜歡的AOP/IOC的答案,遺憾的是那是後話我很難解釋我的老闆... – Offler

+0

@Offler:AOP是不好的一切。考慮一個事實,是的,它以聲明的方式幫助你自動完成任務,所以你的代碼少得多。但另一方面,它隱藏了它內部的行爲,所以不熟悉它的人或者應用程序變得相當複雜時會導致複雜性處理問題。所以如果你要使用它,明智地使用它。 – Tigran

+0

這就是我的意思,我很難解釋AOP對我老闆的用法。此外,我想它的一些其他的東西,如日誌記錄.... – Offler

4

不幸的是,您無法從屬性生成自定義編譯器警告。一些屬性如System.ObsoleteAttribute將生成警告或錯誤,但是這是硬編碼到C#編譯器中的。你應該找到另一個解決你的問題,也許讓Some3rdPartyAttribute繼承RequiredAttribute

否則,你必須改變編譯器。

+0

thx。第三方屬性(不是來自我們)很難繼承我們所需的atrribute,如果使用第三方功能,應該強制程序員給出一些addditioanl信息。 – Offler

0

你可以寫在應用程序啓動運行的一些代碼,使用反射,然後會拋出運行時異常如果屬性是不正確的匹配使用,但我相信這是就可以去,我個人不認爲一個好的方法,因爲您需要運行一次該應用程序以確保它符合您的規則。

而且,看看PostSharp它可以幫助你。

+0

我不想在運行時更改它們。我只想在編譯期間出現一個警告或錯誤,如果不存在一個問題 – Offler

+0

我已經編輯了我的答案,因爲這個初始評論有點不符合上下文。在任何情況下,如果不在運行時使用反射和引發錯誤,我自己也看不到其他選項。 – 2013-07-10 10:25:14

0

如何使用#warning +單元測試?這樣,無論何時運行單元測試,都會生成一個警告(或者您可以使用Debug.Fail而不是#warning)

+0

我不知道如何以編程方式顯示警告只有當一個屬性是存在的,而另一個是不正確的文本? – Offler

+0

如果你正在使用單元測試,這可以很容易地完成...只是檢查方法是否有兩個屬性,並顯示警告,如果它不。或者您可以使用一種測試方法來檢查是否所有使用一個屬性的方法都具有其他必需的屬性 –

0

您可以製作一個控制檯應用程序,它將迭代處理裝配槽中的所有類型反射,檢查規則是否滿足,如果是則返回0,如果規則被破壞,則返回一些其他錯誤代碼和輸出錯誤。

然後讓此控制檯應用程序作爲後期構建任務運行。

0

據我所知,目前還沒有辦法檢查在編譯時屬性。

我最近需要執行類似(從某個基類派生的所有類需要一定的屬性)。我結束了使用反射到基類的構造函數手動檢查(與[Conditional("DEBUG")])。這樣,每當有人創建一個缺少屬性的類的實例時,他們就會得到一個異常。但是,如果你的班級不是全部來自同一班級,這可能不適用於你的情況。

相關問題