2009-08-19 159 views
4

我正在寫一些庫代碼,並且使用該代碼的類需要指定兩個屬性(一個自定義屬性,一個來自.NET)。自定義屬性可以隱含其他屬性而不需要繼承嗎?

將這個需求記錄下來並將這兩個屬性複製粘貼到每個使用我的庫的類上是一件麻煩事,所以我認爲讓我的自定義屬性暗示存在其他。雖然.NET框架的其他屬性是封閉的,所以我不能繼承它...

那麼有沒有什麼辦法可以做到這一點?我可以在運行時添加.NET屬性嗎?

謝謝。

+0

你能告訴我們.Net屬性是什麼嗎? – 2009-08-19 14:42:55

+0

System.ServiceModel.XmlSerializerFormatAttribute – 2009-08-19 14:50:50

回答

1

雖然你可以在屬性中使用繼承,它是recommended you don't

由於這只是一個性能規則,您不會違反正確性,但它可能是一些混淆的根源,您必須花費大量精力確保您不違反基本屬性的語義。如果嘗試使用AttributeUsage標誌擴展屬性的可能位置,則可能會導致問題。有關屬性的規則是quite complex

方法可以應用這兩個屬性中的任何一個,但不能同時應用這兩個屬性。任何未應用的操作都使用應用於包含類的屬性。如果包含的類沒有應用任何一個屬性,則使用DataContractSerializer。

給這個讓它聽起來像是一個明智的計劃。這個API並沒有考慮到這種擴展的設計。

在運行時向現有類添加屬性是沒有辦法的(缺少AOP風格的「代碼注入」)。

+0

這很有道理。我只是保持運行時檢查來執行要求。 – 2009-08-24 19:06:14

0

我不相信有一種方法來暗示次要屬性或在運行時添加屬性。但是,您可以使用自定義代碼模板在添加它們時將這些屬性添加到每個類中。和/或對於已經開發的類,我懷疑你可以編寫一個宏來遍歷每個文件,並將這些屬性添加到類中,但是我過去沒有這樣做,所以我不確定它會帶來什麼,我知道使一個代碼模板添加到一個類聲明的屬性是相對簡單的。但是,這隻適用於您從添加模板的角度添加的課程。如果您還需要對舊類進行清理,那麼如果您需要完成很多文件/類,我會查看宏。或者,如果沒有太多,請手動進行。