开发者

Checking if any property has been assigned a value

开发者 https://www.devze.com 2023-01-20 03:32 出处:网络
I have a type SearchBag that holds a bunch of strings and nullab开发者_运维百科le integers to use for passing on search values. I need a way to check if the search bag contains any values.

I have a type SearchBag that holds a bunch of strings and nullab开发者_运维百科le integers to use for passing on search values. I need a way to check if the search bag contains any values.

I'm currently trying to do it like this:

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

But was wondering if there's a better way.


Without modifying the SearchBag type, there isn't a better way.

EDIT: You could change the type to set a boolean flag in every property setter, then check the flag instead of using Reflection.


You could use Post Sharp to intercept the request to change a property value. You could have all search classes inherit from a common class with a List<string>. Then create an aspect attribute to add a property name to that dictionary whenever the value changes. The following is just a sample, and has bugs:

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

with usage:

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

精彩评论

暂无评论...
验证码 换一张
取 消