相关疑难解决方法(0)

如何通过反射获取当前属性名称?

我想通过反射机制获取属性名称.可能吗?

更新:我有这样的代码:

    public CarType Car
    {
        get { return (Wheel) this["Wheel"];}
        set { this["Wheel"] = value; }
    }
Run Code Online (Sandbox Code Playgroud)

因为我需要更多这样的属性,我想做这样的事情:

    public CarType Car
    {
        get { return (Wheel) this[GetThisPropertyName()];}
        set { this[GetThisPropertyName()] = value; }
    }
Run Code Online (Sandbox Code Playgroud)

c# reflection properties

38
推荐指数
4
解决办法
3万
查看次数

在没有魔术字符串的情况下实现NotifyPropertyChanged

可能重复:
使用linq表达式的typesafe NotifyPropertyChanged

我正在研究一个庞大的团队应用程序,该应用程序正在以大量使用魔术字符串的形式NotifyPropertyChanged("PropertyName")- 在咨询Microsoft时的标准实现.我们还遭受了大量错误命名的属性(使用具有数百个存储的计算属性的计算模块的对象模型) - 所有这些属性都绑定到UI.

我的团队经历了许多与属性名称更改相关的错误,导致错误的魔术字符串和破坏绑定.我希望通过实现属性更改通知而不使用魔术字符串来解决问题.我发现.Net 3.5的唯一解决方案涉及lambda表达式.(例如:实现INotifyPropertyChanged - 是否存在更好的方法?)

我的经理非常担心转换的性能成本

set { ... OnPropertyChanged("PropertyName"); }
Run Code Online (Sandbox Code Playgroud)

set {  ... OnPropertyChanged(() => PropertyName); }
Run Code Online (Sandbox Code Playgroud)

提取名称的位置

protected virtual void OnPropertyChanged<T>(Expression<Func<T>> selectorExpression)
{
    MemberExpression body = selectorExpression.Body as MemberExpression;
    if (body == null) throw new ArgumentException("The body must be a member expression");
    OnPropertyChanged(body.Member.Name);
}
Run Code Online (Sandbox Code Playgroud)

考虑像电子表格这样的应用程序,当参数发生变化时,会在UI上实时重新计算和更新大约一百个值.是否会使此更改变得如此昂贵以至于会影响UI的响应能力?我现在甚至无法证明测试此更改的合理性,因为在各种项目和类中更新属性设置器需要大约2天.

wpf binding inotifypropertychanged .net-3.5

17
推荐指数
1
解决办法
2万
查看次数