2010-10-17 76 views
5

我有一個類型SearchBag持有一堆字符串和可空的整數用於傳遞搜索值。我需要一種方法來檢查搜索包是否包含任何值。檢查是否有任何財產已分配值

我正在試圖做這樣的:

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

但不知道是否有更好的方法。

+0

在我看來,這是做它,除非你有重大的性能問題,一個完全有效的方式。 – steinar 2010-10-17 22:01:03

+0

不確定這是更好的方法,但可以實現INotifyPropertyChanged接口。 – 2010-10-18 06:38:44

回答

4

沒有修改SearchBag類型,沒有更好的方法。

編輯:您可以更改類型以在每個屬性設置器中設置布爾標誌,然後檢查標誌而不是使用反射。

+0

沒有讓我改變它.. – 2010-10-17 19:48:25

+0

@boris:看我的編輯。 – SLaks 2010-10-17 19:53:40

+0

Thx。是的想過,但這需要我將所有自動屬性轉換爲支持值的屬性,並在每個設置器中實現邏輯。這是一個選擇,但我認爲反射成本是不值得的。感謝您的建議。 – 2010-10-17 20:18:52

1

您可以使用Post Sharp來攔截請求以更改屬性值。你可以讓所有的搜索類從一個List<string>的普通類繼承。然後創建一個aspect屬性,以便在值更改時向該字典添加屬性名稱。以下僅僅是一個樣品,並有錯誤:

[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; } 
} 

與用法:

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

由於我不熟悉PostSharp,所以我對Post Sharp進行了快速瀏覽。期待你的例子 – 2010-10-17 19:47:48

+0

不確定在我的特殊情況下反射器的開銷是否值得麻煩,但它總體上看起來像一個有趣的庫。我會牢記這一點以備後用。 Thx :) – 2010-10-17 20:21:59

+0

@boris我用這個庫創建了一個解決方案來判斷數據庫中的一段數據是不是很髒。它最終可以在許多其他情況下重用。 – 2010-10-17 21:46:10