sử dụng giá trị thập phân làm tham số thuộc tính trong c #?


81

Tôi đã cố gắng sử dụng các giá trị thập phân làm tham số cho thuộc tính trường nhưng tôi gặp lỗi trình biên dịch.

Tôi tìm thấy liên kết bài đăng trên blog này nói rằng không thể sử dụng .NET sau đó, có ai biết tại sao họ chọn điều này hoặc làm thế nào tôi có thể sử dụng các tham số thập phân không?


Câu trả lời:


121

Đây là một hạn chế CLR. Chỉ các hằng hoặc mảng nguyên thủy mới có thể được sử dụng làm tham số thuộc tính. Lý do tại sao là một thuộc tính phải được mã hóa hoàn toàn trong siêu dữ liệu. Phần này khác với phần thân phương thức được mã hóa trong IL. Sử dụng MetaData chỉ hạn chế nghiêm trọng phạm vi của các giá trị có thể được sử dụng. Trong phiên bản hiện tại của CLR, các giá trị siêu dữ liệu được giới hạn ở các giá trị nguyên thủy, null, các loại và mảng của các nguyên thủy (có thể đã bỏ sót một số nhỏ).

Số thập phân trong khi kiểu cơ bản không phải là kiểu nguyên thủy và do đó không thể được biểu diễn trong siêu dữ liệu, điều này ngăn nó trở thành một tham số thuộc tính.


5
Đây có còn là vấn đề với Framework 4.0 không? và 4,5, 4,6x?
giữa vũ trụ

@midspace, không thực sự là một vấn đề, chỉ là một hạn chế, do thiết kế áp đặt. Thật không may, nhưng cơ hội tốt là nó có thể không bao giờ biến mất.
Bruno Brant

1
"Chỉ có thể sử dụng các hằng hoặc mảng nguyên thủy làm tham số thuộc tính." Chẳng hạn, nó có vẻ không đúng chính xác, System.Type cũng được cho phép: msdn.microsoft.com/en-us/library/aa664615(v=vs.71).aspx
DixonD

Using MetaData only severely restricts the scope of values that can be used- Tại sao vậy? Siêu dữ liệu có thể được sử dụng để trỏ đến các định nghĩa. Ví dụ: khi bạn xác định một trường trong một lớp thông thường, siêu dữ liệu sẽ được phát ra bao gồm tên của trường và kiểu của trường đó (Kiểu bất kỳ, không phải kiểu nguyên thủy). Tôi không hiểu tại sao điều này không thể được sử dụng cho các thuộc tính.
Winger Sendon

15

Tôi có cùng một vấn đề. Tôi xem xét để sử dụng chuỗi . Điều này không an toàn về kiểu chữ, nhưng nó có thể đọc được và tôi nghĩ chúng ta sẽ có thể viết các số hợp lệ trong chuỗi :-).

class BlahAttribute : Attribute
{
  private decimal value;

  BlahAttribute(string number)
  {
    value = decimal.Parse(number, CultureInfo.InvariantCulture);
  }
}

[Blah("10.23")]
class Foo {}

Nó không phải là một vẻ đẹp, nhưng sau khi xem xét tất cả các lựa chọn, nó đủ tốt.


1
Có vẻ như đó là cách mbUnit đối phó vkreynin.wordpress.com/2007/05/25/…
Andy Dent,

2

Khi tôi gặp phải tình huống này, tôi đã kết thúc việc để lộ các thuộc tính trên thuộc tính dưới dạng Double, nhưng bên trong thuộc tính lại coi chúng như Decimal. Không hoàn hảo lắm, nhưng đối với những trường hợp đơn giản, nó có thể là thứ bạn cần.


1

Đối với các thủ thuật thời gian thực với các thuộc tính, tôi đang sử dụng lớp TypeConverter .


0

Bạn có thể sử dụng hàm tạo sau. Khi bạn có một ký tự thập phân trong mã C #, trình biên dịch C # sẽ phát ra một lệnh gọi đến hàm tạo này.

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

Chỉnh sửa: Tôi biết điều này không thuận tiện.


2
Nếu đây làm việc trong một thuộc tính, sau đó tôi đoán chỉ đơn giản bằng cách sử dụng "m" hậu tố sẽ quá, nhưng không phải không (Sử dụng System.ComponentModel.DefaultValueAttribute như thử nghiệm của tôi)
xr280xr
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.