2010-10-17 38 views
5

Tôi có một loại SearchBag chứa một chuỗi các chuỗi và số nguyên có thể vô hiệu để sử dụng để truyền các giá trị tìm kiếm. Tôi cần một cách để kiểm tra xem túi tìm kiếm có chứa bất kỳ giá trị nào không.Kiểm tra xem bất kỳ thuộc tính nào đã được gán giá trị

tôi đang cố gắng để làm điều đó như thế này:

public bool HasValues() 
    { 
     return GetType().GetProperties().Any(p => p.GetValue(this, null) != null); 
    } 

Nhưng đã tự hỏi nếu có một cách tốt hơn.

+0

Trong tâm trí của tôi, đây là một cách hoàn toàn hợp lệ để làm điều đó trừ khi bạn có mối quan tâm hiệu suất lớn. – steinar

+0

Không chắc chắn đó là cách tốt hơn nhưng bạn có thể triển khai giao diện INotifyPropertyChanged. –

Trả lời

4

Không sửa đổi loại SearchBag, không có cách nào tốt hơn.

EDIT: Bạn có thể thay đổi loại để đặt cờ boolean trong mỗi bộ đặt thuộc tính, sau đó kiểm tra cờ thay vì sử dụng Reflection.

+0

Không có gì ngăn tôi thay đổi .. –

+0

@boris: Xem chỉnh sửa của tôi. – SLaks

+0

Thx. Có suy nghĩ về điều đó nhưng điều đó sẽ yêu cầu tôi phải chuyển đổi tất cả các thuộc tính tự động thành các thuộc tính có giá trị được sao lưu và thực hiện logic trong mỗi bộ setter. Đó là một lựa chọn, nhưng tôi nghĩ rằng chi phí phản ánh không đáng giá. Cám ơn vì sự gợi ý. –

1

Bạn có thể sử dụng Post Sharp để chặn yêu cầu thay đổi giá trị thuộc tính. Bạn có thể có tất cả các lớp tìm kiếm được kế thừa từ một lớp chung với một số List<string>. Sau đó, tạo thuộc tính aspect để thêm tên thuộc tính vào từ điển đó bất cứ khi nào giá trị thay đổi. Sau đây chỉ là một mẫu, và có lỗi:

[Serializable] 
public class PropertyChangeAwareAttribute : OnMethodBoundaryAspect 
{ 
    public override void OnEntry(MethodExecutionEventArgs eventArgs) 
    { 
     if (eventArgs.Method.Name.StartsWith("set_")) 
      ((SearchBagBase)eventArgs.Instance).PropertiesChanged.Add(eventArgs.Method.Name); 
     base.OnEntry(eventArgs); 
    } 
} 


abstract class SearchBagBase 
{ 
    public List<string> PropertiesChanged = new List<String>(); 
} 

[PropertyChangeAware] 
class RegularSearch : SearchBagBase 
{ 
    public String Key { get; set; } 
} 

với việc sử dụng:

RegularSearch regularSearch = new RegularSearch(); 
regularSearch.Key = "toys"; 
regularSearch.PropertiesChanged.ForEach(Console.WriteLine); 
+0

Vì tôi không quen với PostSharp, tôi đã lướt qua nhanh bài đăng Sharp. Nhìn về phía trước ví dụ của bạn –

+0

Không chắc chắn chi phí phản xạ trong trường hợp cụ thể của tôi có giá trị rắc rối, nhưng nó có vẻ giống như một thư viện thú vị trên toàn bộ. Tôi sẽ ghi nhớ điều này để sử dụng sau này. Thx :) –

+0

@boris Tôi đã tạo ra một giải pháp sử dụng thư viện này để biết một mẩu dữ liệu từ cơ sở dữ liệu có bị bẩn hay không. Nó đã được tái sử dụng trong nhiều tình huống khác. –

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