代码之家  ›  专栏  ›  技术社区  ›  rjlopes

在c#中使用十进制值作为属性参数?

  •  72
  • rjlopes  · 技术社区  · 17 年前

    我一直试图使用十进制值作为字段属性的参数,但我得到了一个编译器错误。

    我找到了这篇博文 link 如果说在.NET中无法使用,有人知道他们为什么选择这个,或者我如何使用十进制参数吗?

    5 回复  |  直到 6 年前
        1
  •  126
  •   JaredPar    17 年前

    这是一个CLR限制。只有基元常量或基元数组可以用作属性参数。原因是属性必须完全在元数据中编码。这与用IL编码的方法体不同。使用元数据只会严重限制可以使用的值的范围。在当前版本的CLR中,元数据值仅限于原语、null、原语类型和数组(可能缺少一个较小的)。

    基本类型不是基元类型,因此不能在元数据中表示小数,这会阻止它成为属性参数。

        2
  •  18
  •   Stefan Steinegger    16 年前

    我也有同样的问题。我考虑使用 串 . 这不是类型安全的,但它是可读的,我认为我们将能够在字符串中写入有效的数字:-)。

    class BlahAttribute : Attribute
    {
      private decimal value;
    
      BlahAttribute(string number)
      {
        value = decimal.Parse(number, CultureInfo.InvariantCulture);
      }
    }
    
    [Blah("10.23")]
    class Foo {}
    

    这不是一种美,但在考虑了所有的选择之后,它已经足够好了。

        3
  •  2
  •   ckittel evasilchenko    17 年前

    遇到这种情况时,我最终将属性作为Double公开,但在属性内部将其视为Decimal。远非完美,但对于简单的情况,它可能正是您所需要的。

        4
  •  1
  •   Avram    17 年前

    对于我使用的属性的实时技巧 TypeConverter 班

        5
  •  0
  •   Sam Harwell    17 年前

    您可以使用以下构造函数。当您在C代码中有一个十进制文本时,C编译器将发出对该构造函数的调用。

    Decimal(Int32, Int32, Int32, Boolean, Byte)

    编辑:我知道这不方便。

    推荐文章