代码之家  ›  专栏  ›  技术社区  ›  Boris Callens

检查是否为任何属性分配了值

  •  5
  • Boris Callens  · 技术社区  · 14 年前

    我有一种类型 SearchBag 它包含一组字符串和可为空的整数,用于传递搜索值。我需要一种方法来检查搜索包是否包含任何值。

    我现在正试着这样做:

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

    但不知道有没有更好的办法。

    2 回复  |  直到 14 年前
        1
  •  4
  •   SLaks    14 年前

    不修改 SearchBag 类型,没有更好的方法。

    编辑 :可以将类型更改为在每个属性设置器中设置布尔标志,然后检查该标志而不是使用反射。

        2
  •  1
  •   Yuriy Faktorovich    14 年前

    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);