[英]Getting PropertyInfo Name and Value
我已經看到了各種各樣的方法,包括反射,組件模型類型描述符,表達式樹和方面,但是我仍然不確定下面的代碼是否使用.Net 4.0或更高版本實現了以下所有目標:
如何改進代碼?
protected void NotifyOfPropertyChanging<TProperty>(Expression<Func<TProperty>> property) {
var memberExpression = (MemberExpression)property.Body;
var prop = (PropertyInfo) memberExpression.Member;
var propertyName = prop.Name;
var value = prop.GetValue(this, null);
// fire INPC using propertyName
// use value and name to do IsDirty checking
}
您可以通過編譯表達式樹並將其緩存以供將來使用,而不是每次都調用GetValue
來提高性能。 但是,僅當您的當前實現引起瓶頸時才應進行此類優化。
void NotifyOfPropertyChanging<TProperty>(Expression<Func<TProperty>> property)
{
var memberExpression = (MemberExpression) property.Body;
var prop = (PropertyInfo) memberExpression.Member;
Func<TProperty> accessor;
if (!TypedAccessorCache<TProperty>.Cache.TryGetValue(prop, out accessor))
{
accessor = property.Compile();
TypedAccessorCache<TProperty>.Cache[prop] = accessor;
}
var value = accessor();
// ...
}
static class TypedAccessorCache<TProperty>
{
public static readonly IDictionary<PropertyInfo, Func<TProperty>> Cache =
new Dictionary<PropertyInfo, Func<TProperty>>();
}
注意,我使用了通用靜態類型來保存緩存字典實例。 這是為每種不同的屬性類型有效創建單獨的類型化緩存的便捷方法。
這是一個漫長的故事,我想仍然沒有一種方法能比其他方法更好。 我認為在大多數通常的業務場景中,表達式不會成為性能瓶頸(並且您可以優化一小段代碼,如果需要的話,稍后需要更快的通知),因此這種方法應該不錯。
請記住,創建表達式樹比解析它要花費更多的時間,因此請確保只執行一次(即使用靜態類級別的表達式變量)。 但是,在這種情況下,您的模型代碼會有點腫。
我個人更喜歡使用基於字符串的INPC處理。 ReSharper在進行重構時可以很好地與字符串配合使用,因此我可以說它相對安全。 據我所知,這是最快的方法。 使用VS或ReSharper片段,您可以通過幾次按鍵輕松地編寫屬性。
關於屬性值-INotifyPropertyChanging或INotifyPropertyChanged接口均未使用它。 你為什么需要它?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.