【问题标题】:CustomAttribute: how to set DateTime.NowCustomAttribute:如何设置 DateTime.Now
【发布时间】:2019-08-06 14:19:18
【问题描述】:

我正在寻找一种优雅的方式来将 DateTime.Now 的值设置为属性的值。

我有这个代码:

    [MyValue(DateTime.Now)]
    public DateTime? VertragDatum { get; set; }

但我收到一个语法错误并告诉我 Type DateTime 不是有效的属性参数类型。您知道如何实现这一目标吗?

我的实现:

public class MyValueAttribute : Attribute
{
    public string MyValue { get; }

    public MyValueAttribute(DateTime myValue)
    {
        MyValue = myValue.ToString();
    }
}

【问题讨论】:

  • 您希望何时设置该值?关于对象创建,类型初始化?在这里听起来像是一个 xy 问题。
  • 请注意,DateTime.Now 将在 编译时 设置(例如 6 Aug 2019 17:21:05)并在 运行时 读取(比如在14 Oct 2019 14:52:47)。你真的想要这样的行为吗?
  • 按照@dymanoid 所说的,唯一可以用作属性的构造函数参数的是常量表达式。 C# 没有常量或文字 DateTimes(与 VB 不同)。如果一直是DateTime.Now,可以在构造函数中设置。但是,DateTime.Now 不仅不能在原处工作,而且没有 DateTime 表达式。
  • 您可以潜在地创建一个“fody”编织器,以将当前日期时间作为字符串或某种基于 roslyn 的插件注入。我怀疑这超出了用户对这个问题的期望范围。

标签: c# attributes


【解决方案1】:

DateTime 不是受支持的类型。

引用here 的有效类型为:

属性类的位置参数和命名参数的类型 仅限于属性参数类型,它们是:

  • 以下类型之一:bool、byte、char、double、float、int、long、sbyte、short、string、uint、ulong、ushort。
  • 类型对象。
  • System.Type 类型。
  • 枚举类型,前提是它具有公共可访问性,并且它嵌套的类型(如果有)也具有公共可访问性(属性 规格)。
  • 上述类型的一维数组。
  • 不具有这些类型之一的构造函数参数或公共字段不能用作位置参数或命名参数 属性规范。

【讨论】:

  • 我认为由于这个问题一般被否决
【解决方案2】:

specs 说:

属性类的位置参数和命名参数的类型 仅限于属性参数类型,它们是:

以下类型之一:bool、byte、char、double、float、int、 long, sbyte, short, string, uint, ulong, ushort.

【讨论】:

  • 这个答案缺少有效的参数类型。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-04-28
  • 2013-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-19
  • 1970-01-01
相关资源
最近更新 更多