2012-10-24 23 views
6

thể trùng lặp:
Setting the default value of a DateTime Property to DateTime.Now inside the System.ComponentModel Default Value AttrbuteSetting Giá trị mặc định cho một tài sản trên C#

Im tạo một điều khiển như một cuốn lịch, và tôi muốn sử dụng để thiết lập de năm họ muốn xem. Nhưng nếu không, tài sản của SelectedYear phải là năm thực tế.

tôi cố gắng thiết lập này Giá trị mặc định như thế này:

[DefaultValue(DateTime.Today.Year)] 
public int SelectedYear{ 
    get{ 
     return _selYear; 
    } 
    set{ 
     _selYear = value; 
     UpdateCalendar(); 
    } 
} 

Và tôi đã nhận lỗi sau

An attribute argument must be a constant expression, typeof expression or array creation expression of an attribute parameter type 
+0

Đó không phải là thuộc tính đó. Đặt giá trị thuộc tính mặc định trong ctor mặc định của lớp là một tùy chọn phổ biến. – asawyer

+0

Đây là giá trị mặc định của nhà thiết kế, có nghĩa là nếu điều khiển có giá trị năm nhất định, giá trị sẽ không được in đậm trong cửa sổ thuộc tính. Nó không ảnh hưởng đến giá trị thuộc tính. –

+0

Nếu bạn đang xây dựng một điều khiển sau đó tôi tin rằng thiết lập giá trị mặc định trong constructor sẽ là một nơi tốt. – jags

Trả lời

6

Thuộc tính Year của DateTime là giá trị được tính nhưng bạn đang cố gắng nhúng giá trị đó vào một thuộc tính là giá trị bất biến được lưu trữ trong tệp nhị phân. Hai khái niệm này không tương thích.

Điều bạn muốn làm ở đây là có điểm đánh dấu để lưu ý rằng giá trị chưa được đặt và trả về Year hiện tại trong trường hợp đó. Đây là một nơi tốt để sử dụng giá trị rỗng

int? _selYear; 
public int SelectedYear { 
    get { return _selYear ?? DateTime.Today.Year; } 
    set { 
    _selYear = value; 
    UpdateCalendar(); 
    } 
} 
0

Vâng, lỗi này là khá rõ ràng:

Một cuộc tranh cãi thuộc tính phải là cụm từ không đổi ...

Vì vậy, nếu điều đó đã làm hoạt động, giá trị mặc định thực sự là gì? Vâng, đó sẽ là năm mà trong đó bạn đã biên dịch mã số. Có lẽ không phải những gì bạn muốn.

Nếu bạn thực sự muốn trả về năm hiện tại theo mặc định thì đơn giản là khởi tạo nó vào điều đó trong hàm tạo của bạn.

0

Tại sao không set các backing field thay vì như thế này trong constructor -

_selYear = DateTime.Today.Year 

Nó sau đó sẽ luôn là default giá trị nếu người dùng không cài đặt nó.

0

DateTime.Today.Year không phải là giá trị không đổi vì nó thay đổi hàng năm. Bạn có thể kiểm tra xem _selYear đã được xác định hoặc không sử dụng này:

public int SelectedYear{ 
    get{ 
     if (_selYear.Equals(0)){ 
      return DateTime.Today.Year; 
     } 
     else{ 
      return _selYear; 
     } 
    } 
    set{ 
     _selYear = value; 
     UpdateCalendar(); 
    } 
} 

này đang xem xét khi bạn bắt đầu _selYear để 0.

0

Điều này là do DefaultValue chỉ chấp nhận giá trị không đổi. Bạn có thể làm điều này thông qua một cách tiếp cận khác một số điều như bên dưới

public int SelectedYear{ 
    get{ 
     return _selYear == 0 ? DateTime.Now.Year : _selYear; 
    } 
    set{ 
     _selYear = value; 
     UpdateCalendar(); 
    } 
} 

Hy vọng điều này sẽ giúp ích !!

1

Bạn nên khởi tạo giá trị của thuộc tính một cách rõ ràng. Thuộc tính DefaultValue không khởi tạo thuộc tính bởi giá trị nó chỉ cung cấp siêu dữ liệu mà giá trị mặc định.

Bạn có thể khởi tạo nó trong ctor của một loại hoặc bạn có thể viết mã tùy chỉnh sẽ phản ánh loại và khởi tạo thuộc tính theo các giá trị từ siêu dữ liệu loại.

3

Sử dụng AmbientValueAttribute để cho biết rằng khi bạn đặt thuộc tính thành giá trị mặc định, nó thực sự có nghĩa là lấy ngày hiện tại.

int _selYear = 0; 

[AmbientValue(0)] 
[DefaultValue(0)] 
public int SelectedYear{ 
    get{ 
     if (_selYear == 0) 
      return DateTime.Today.Year; 
     return _selYear; 
    } 
    set{ 
     _selYear = value; 
     UpdateCalendar(); 
    } 
} 

Nếu bạn muốn sử dụng các giá trị 0, sau đó bạn có thể làm cho nó nullable, nhưng không bao giờ trở về null, chỉ cho phép thiết lập null:

int _selYear = null; 

[AmbientValue(null)] 
[DefaultValue(null)] 
public int? SelectedYear{ 
    get{ 
     return _selYear ?? DateTime.Today.Year; 
    } 
    set{ 
     _selYear = value; 
     UpdateCalendar(); 
    } 
} 

Bây giờ, nó là giá trị null đại diện cho năm nay.

AmbientValueAttribute có nghĩa là: nếu bạn đặt thuộc tính này thành giá trị đó, khi bạn nhận được thuộc tính, giá trị khác sẽ được trả về môi trường và giá trị trả lại trong trường hợp đó có thể thay đổi, giống như ngày hiện tại .

Các vấn đề liên quan