背景
我正在尝试实现一个自定义属性,该属性可以应用于 .NET 程序集以指示到期日期(在此日期之后开发人员不支持使用已分发用于测试的预发行版本) )。它必须用 .NET Standard (2.0) 编写。
我知道我无法将 DateTime
作为参数传递,因此我传递了一个符合 ISO8601 的字符串。 (YYYY-MM-DD),然后使用 DateTime.Parse()
转换为 DateTime
。
到目前为止我得到的属性如下:
[AttributeUsage(AttributeTargets.Assembly, Inherited = false, AllowMultiple = false)]
public sealed class UnstableReleaseExpiryAttribute : Attribute
{
public UnstableReleaseExpiryAttribute(string expiryDate)
{
ExpiryDate = expiryDate;
}
public DateTime Expiry
{
get
{
if (ExpiryDate != null && DateTime.TryParse(ExpiryDate, out DateTime expiry))
return expiry;
return DateTime.MaxValue;
}
}
public string ExpiryDate { get; }
}
这就是我打算使用它的方式:
[assembly: UnstableReleaseExpiry("2018-05-24")]
问题
有没有办法使用正则表达式来验证字符串输入,并在日期实际上不可解析时停止编译它?我环顾四周,认为继承自 ValidationAttribute
将是做到这一点的方法,但它似乎在 .NET Standard 2.0 中不可用。还有其他方法可以做到这一点吗?
最佳答案
没有。目前还没有。 ValidationAttribute
只是关于字段/属性格式的“注释”。其他 C# 代码必须激活它。
- 您可以创建代码分析规则来检查这一点。
- 类似问题:Is it possible to query custom Attributes in C# during compile time ( not run-time ) , Postsharp compile-time validation on interface methods 。您可能可以使用
Fody
而不是PostSharp
- 我使用过的简单解决方案(因为处理编译后步骤很痛苦,并且可以禁用代码分析器):如果您有一个单元测试项目,请进行一个使用反射来查找属性的所有用法的测试,并且检查一下。
关于c# - 带有 DateTime 参数的 .NET 标准程序集属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50503827/