首页 / C# / c# – 使用属性约束类型 – .NET
c# – 使用属性约束类型 – .NET
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c# – 使用属性约束类型 – .NET,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1955字,纯文字阅读大概需要3分钟。
内容图文
在你离开之前:虽然我的代码是在F#中,但这个问题适用于任何.NET语言.
所以这是我的情况 – 我在F#中有一个简单的ProgramOptions记录,用于保存命令行选项数据.每个字段代表一个不同的选项,它们可以具有默认值,这些默认值用自定义属性标记.
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
有没有办法让这种类型安全?某种通用的诡计?或者是我想要的不可能?
解决方法:
据我所知,这是不可能的,但即使是这样,它会带给你什么?您只能在属性中使用文字,因此您将被限制为string,int,bool和一些其他类型.
如果在某一天你想要定义一个带有DateTimeOffset值的记录(不是一个不合理的情况)怎么办?
type myRecord = {
[<ProgramOption(???)>]Date : DateTimeOffset
[<ProgramOption("foo")>]Text : string }
你会把哪个ProgramOption放在Date元素上?
也就是说,你不一定要想出你自己的属性. BCL已经定义了一个[<DefaultValue>] attribute,以及许多所谓的data annotations attributes.在我看来,它们中没有一个对任何东西都有用.例如,here’s an in-depth explanation of why the Required attribute is redundant.该文章是关于面向对象的设计,但也适用于函数编程.
在像F#这样的静态类型的函数语言中,你应该是make illegal states unrepresentable.
最后,我认为更简单的方法是为每种类型定义一个默认值,如下所示:
type ProgramOptions = {
Output: string
PrintOutput: bool
// several more
}
let defaultProgramOptions = { Output = "render.pdf"; PrintOutput = true }
这样您就可以根据默认值轻松创建值:
let myProgOps = { defaultProgramOptions with PrintOutput = false }
这在编译时是类型安全的,并使用以下组成元素生成ProgramOptions值:
{ Output = "render.pdf"; PrintOutput = false; }
内容总结
以上是互联网集市为您收集整理的c# – 使用属性约束类型 – .NET全部内容,希望文章能够帮你解决c# – 使用属性约束类型 – .NET所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。