Проверка, если какое-либо свойство было присвоено значение - PullRequest
5 голосов
/ 17 октября 2010

У меня есть тип SearchBag, который содержит набор строк и целых чисел, которые можно использовать для передачи значений поиска. Мне нужен способ проверить, содержит ли поисковая сумка какие-либо значения.

Я сейчас пытаюсь сделать это так:

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

Но было интересно, есть ли лучший способ.

Ответы [ 2 ]

4 голосов
/ 17 октября 2010

Без изменения типа SearchBag лучшего способа нет.

РЕДАКТИРОВАТЬ : Вы можете изменить тип, чтобы установить логический флаг в каждом установщике свойств, затем установить флажок вместо использования Reflection.

1 голос
/ 17 октября 2010

Вы можете использовать Post Sharp для перехвата запроса на изменение значения свойства. Вы можете иметь все классы поиска, наследуемые от общего класса с List<string>. Затем создайте атрибут аспекта, чтобы добавить имя свойства в этот словарь при каждом изменении значения. Ниже приведен только пример, и есть ошибки:

[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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...