簡體   English   中英

獲取PropertyInfo名稱和值

[英]Getting PropertyInfo Name and Value

我已經看到了各種各樣的方法,包括反射,組件模型類型描述符,表達式樹和方面,但是我仍然不確定下面的代碼是否使用.Net 4.0或更高版本實現了以下所有目標:

  1. 輸入安全,重構友好(無魔術字符串)且可讀
  2. 最大化多個通話的性能
  3. 提供財產名稱
  4. 提供財產的價值

如何改進代碼?

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片段,您可以通過幾次按鍵輕松地編寫屬性。

關於屬性值-INotifyPropertyChangingINotifyPropertyChanged接口均未使用它。 你為什么需要它?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM