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

时间:2010-10-17 19:22:22

标签: c# .net reflection

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

我目前正在尝试这样做:

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

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

2 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分: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);