在您離開之前:儘管我的代碼位於F#中,但此問題適用於任何.NET語言。使用屬性約束類型 - .NET
所以這裏是我的情況 - 我有一個簡單的ProgramOptions記錄在F#中用於存放命令行選項數據。每個字段代表一個不同的選項,並且它們可以具有默認值,這些默認值用自定義屬性標記。
type ProgramOptionAttribute(defaultValue: obj) =
inherit Attribute()
type ProgramOptions =
{ [<ProgramOption("render.pdf")>] output: string
[<ProgramOption(true)>] printOutput: bool
// several more
}
我已經寫了一個漂亮的小功能,在其他地方動態實例使用的屬性數據這個記錄,因爲原始命令行選項。這很好。但是,通過向屬性提供一個對象來引入運行時類型不匹配是非常容易的,該屬性是與該字段不同的屬性(因爲obj - >字段類型只是簡單的強制轉換)。例如:
// Obviously wrong, but compiles without complaint, failing at runtime
[<ProgramOption(42)>] myField: bool
有沒有辦法讓這種類型安全?某種通用的欺騙?或者是我想要的不可能?
我沒有時間寫一個正確的答案,但看看[在這個SO問題](http://stackoverflow.com/questions/294216/why-does-c -sharp-禁止,屬屬性類型)。當然,這是一個較老的問題,但它似乎並不表示您想要的是泛型。那裏的評論也表明,也許你可以用'typeof'等做一些事情。但即使如此,我也不相信你會得到你想要的編譯錯誤。 – Becuzz