2008-09-22 30 views
6

Tôi muốn biết nếu có bất kỳ cách nào để thêm hành vi tùy chỉnh vào các phương thức get/set thuộc tính tự động.C# 3.0 Thuộc tính tự động - Có thể thêm hành vi tùy chỉnh không?

Trường hợp hiển nhiên tôi có thể nghĩ là muốn mọi phương thức thuộc tính được đặt để gọi trên bất kỳ trình xử lý sự kiện PropertyChanged nào là một phần của triển khai System.ComponentModel.INotifyPropertyChanged. Điều này sẽ cho phép một lớp có nhiều thuộc tính có thể được quan sát, trong đó mỗi thuộc tính được định nghĩa bằng cách sử dụng cú pháp thuộc tính tự động.

Về cơ bản, tôi tự hỏi liệu có bất kỳ điều gì tương tự với mẫu get/set hoặc đăng hook/set hook với phạm vi lớp hay không.

(Tôi biết các chức năng tương tự cuối cùng có thể dễ dàng đạt được trong những cách hơi dài dòng hơn - Tôi chỉ ghét sự trùng lặp của một mô hình)

Trả lời

17

Không, bạn sẽ phải sử dụng các định nghĩa tài sản "truyền thống" cho hành vi tùy chỉnh.

1

Nếu đó là hành vi bạn sẽ lặp lại rất nhiều trong quá trình phát triển, bạn có thể tạo đoạn mã tùy chỉnh cho loại thuộc tính đặc biệt của mình.

4

Không, bạn không thể: thuộc tính tự động là lối tắt cho người truy cập rõ ràng vào trường riêng tư. ví dụ.

public string Name { get; set;} 

là một phím tắt để

private string _name; 
public string Name { get { return _name; } set { _name = value; } }; 

Nếu bạn muốn đặt logic tùy chỉnh bạn phải viết get và set một cách rõ ràng.

1

Bạn có thể xem xét sử dụng PostSharp để viết bộ chặn của người định cư. Cả LGPL và GPL đều phụ thuộc vào phần nào của thư viện bạn sử dụng.

1

Giải pháp gần nhất tôi có thể nghĩ đến là sử dụng một phương pháp helper:

public void SetProperty<T>(string propertyName, ref T field, T value) 
{ field = value; 
    NotifyPropertyChanged(propertyName); 
} 

public Foo MyProperty 
{ get { return _myProperty} 
    set { SetProperty("MyProperty",ref _myProperty, value);} 
} Foo _myProperty; 
2

Look để PostSharp. Đó là một khuôn khổ AOP cho vấn đề điển hình "mẫu mã này tôi làm hunderd thời gian một ngày, làm thế nào tôi có thể tự động hóa nó?". Bạn có thể đơn giản hóa với PostSharp này (ví dụ):

public Class1 DoSomething(Class2 first, string text, decimal number) { 
    if (null == first) { throw new ArgumentNullException("first"); } 
    if (string.IsNullOrEmpty(text)) { throw new ArgumentException("Must be not null and longer than 0.", "text") ; } 
    if (number < 15.7m || number > 76.57m) { throw new OutOfRangeArgumentException("Minimum is 15.7 and maximum 76.57.", "number"); } 

    return new Class1(first.GetSomething(text), number + text.Lenght); 
} 

để

public Class1 DoSomething([NotNull]Class2 first, [NotNullOrEmpty]string text, [InRange(15.7, 76.57)]decimal number) { 
     return new Class1(first.GetSomething(text), number + text.Lenght); 
} 

Nhưng đây không phải là tất cả! :)

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