我有一个类型SearchBag
,它包含一堆字符串和可空的整数,用于传递搜索值。我需要一种方法来检查搜索包是否包含任何值。
我目前正在尝试这样做:
public bool HasValues()
{
return GetType().GetProperties().Any(p => p.GetValue(this, null) != null);
}
但是想知道是否有更好的方法。
答案 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);