获取属性信息名称和值
本文关键字:属性 信息 获取 | 更新日期: 2023-09-27 18:33:12
我已经看到了各种方法,包括反射、组件模型类型描述符、表达式树和方面,但我仍然不确定下面的代码是否使用 .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 接口使用。你为什么需要它?