2010-10-17 35 views
5

Ho un tipo SearchBag che contiene un gruppo di stringhe e numeri interi nulli da utilizzare per trasmettere i valori di ricerca. Ho bisogno di un modo per controllare se la borsa di ricerca contiene valori.Controllare se a qualsiasi proprietà è stato assegnato un valore

Attualmente sto cercando di fare in questo modo:

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

Ma chiedevo se c'è un modo migliore.

+0

Nella mia mente, questo è un modo del tutto valido per farlo a meno che non si dispone di importanti problemi di prestazioni. – steinar

+0

Non è sicuro che sia un modo migliore, ma è possibile implementare l'interfaccia INotifyPropertyChanged. –

risposta

4

Senza modificare il tipo SearchBag, non esiste un modo migliore.

EDIT: È possibile modificare il tipo per impostare un flag booleano in ogni set di proprietà, quindi controllare il flag anziché utilizzare Reflection.

+0

Niente mi impedisce di cambiarlo .. –

+0

@boris: vedere la mia modifica. – SLaks

+0

Thx. Sì, pensavo a questo, ma mi avrebbe richiesto di convertire tutte le proprietà automatiche in proprietà con valore aggiunto e implementare la logica in ciascun setter. È un'opzione, ma penso che il costo della riflessione non ne valga la pena. Grazie per il suggerimento. –

1

È possibile utilizzare Post Sharp per intercettare la richiesta di modifica di un valore di proprietà. Potresti avere tutte le classi di ricerca ereditate da una classe comune con un List<string>. Quindi creare un attributo aspetto per aggiungere un nome di proprietà a quel dizionario ogni volta che il valore cambia. Quanto segue è solo un esempio, e ha bug:

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

con l'uso:

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

Dato che non conosco PostSharp, ho dato una rapida occhiata a Post Sharp. Non vedo l'ora del tuo esempio –

+0

Non sono sicuro che l'overhead del riflettore nel mio caso valga la pena, ma sembra un'intera libreria nel suo complesso. Terrò questo a mente per un uso successivo. Thx :) –

+0

@boris Ho creato una soluzione usando questa libreria per capire se un dato dal database era sporco o no. Finì per essere riutilizzabile in molte altre situazioni. –

Problemi correlati