`

C# - Example to Refactor-proof reference to members

    博客分类:
  • C#
c# 
阅读更多

as we have discussed on the previous example that we have introduce the code snippet like this (see here):

 

 

serializationContext.AddProperty(x => x.BirthDate);

 

in this post, we are going to present a way that demonstrate how we can leverage the Lambda expression and effectively achieve refactor-proof references.

 

Our example is more about a very typical use case - the INotifyPropertyChanged impl. Where normally we will create a Invoke Pattern, and to that patter, one parameter is necessary, that is the name of the parameter. 

 

normally , if we give a string for that name, we loose the ability to guard against changes when code is refactored. So, if we allow passing of a static typed LambdaExpression, such as this (this is a base class that will implements the IPropertyChanged)

 

 

  public class ObservableObject : INotifyPropertyChanged
  {
    public event PropertyChangedEventHandler PropertyChanged;

    #region Protected
    protected void InvokePropertyChanged()
    {
      throw new NotImplementedException();
    }
    protected void InovkePropertyChagned(string name)
    {
      throw new NotImplementedException();
    }
    protected void InvokePropertyChanged(Expression<Func<object>> property_)
    {
      System.Diagnostics.Debug.Assert(property_ != null);
      var body = property_.Body;
      var memberAccessExpression = ((MemberExpression)body);
      var memberName = memberAccessExpression.Member.Name;
      Console.WriteLine("InvokePropertyChanged on {0}", memberName);
    }

    #endregion Protectedk
  }

 

So when we define a Concrete Observable class, and when we need to notify the changes, such as this

 

 

public class ObservableConcreteObject : ObservableObject
  {
    private string m_message;

    public string Message
    {
      get { return m_message; }
      set
      {
        m_message = value;
        
        InvokePropertyChanged("Message");
      }
    }
  }
 

 

You can actually change the call to InvokePropertyChanged as this:

 

 

public string Message
    {
      get { return m_message; }
      set
      {
        m_message = value;
        // you can invoke like this;
        InvokePropertyChanged(() => this.Message);
      }
    }

 

So, all this is possbile when we try to pass in a lambda expression.

分享到:
评论

相关推荐

    sublime-text-refactor, 用于Javascript代码的sublime text 重构插件.zip

    sublime-text-refactor, 用于Javascript代码的sublime text 重构插件 用于 sublime-text-2和 3的 Javascript重构插件 [[Package Control] ( https://packagecontrol.herokuapp.com/downloads/JavaScript%2

    IOS应用源码——zac-dragkit-before-refactor-24-g5d02de8.rar

    【标题】"IOS应用源码——zac-dragkit-before-refactor-24-g5d02de8.rar" 提供的是一份iOS应用的源代码,这个项目在进行重构前的版本,具体版本号为24,Git提交哈希值为5d02de8。这个源代码库可能包含了一个名为...

    discover-clj-refactor.el:发现 clj-refactor 的上下文菜单

    在Emacs编辑器中,`clj-refactor.el`是一个非常强大的Clojure代码重构工具,它为Clojure编程提供了丰富的功能。而`discover-clj-refactor.el`则是这个工具的一个扩展,它添加了上下文菜单,使用户可以更直观、方便地...

    Time-Of-Work-Refactor

    在"Time-Of-Work-Refactor-master"项目中,我们可能遇到如下重构场景: 1. 如果发现大量重复代码,可以通过提取方法或创建模板来消除代码冗余。 2. 如果有复杂的条件语句,可以考虑使用策略模式或者枚举来简化逻辑...

    groovy-demo-java-for-refactor:在演示期间用于重构为Groovy的示例Java代码

    《Java到Groovy的重构之旅:groovy-demo-java-for-refactor项目详解》 在软件开发领域,语言的选择往往直接影响到项目的效率与可维护性。Java作为一款广泛应用的面向对象编程语言,以其严谨的类型检查和丰富的类库...

    Homework-01-Code-Refactor

    本篇文章将深入探讨“Homework-01-Code-Refactor”项目中的HTML重构实践,揭示其中蕴含的编程原则和最佳实践。 首先,我们要理解HTML(HyperText Markup Language)是网页的基础结构语言,用于定义网页内容的布局和...

    Horiseon-Code-Refactor

    在"Horiseon-Code-Refactor-main"目录下,我们可以看到项目的源代码和可能的修改文件。通过对比重构前后的差异,我们可以学习到如何将最佳实践应用到实际项目中,提升我们的HTML编码技能。 总结来说,"Horiseon-...

    password-gen-refactor

    在文件名列表中看到的"password-gen-refactor-main"可能是指项目的主文件或入口点,可能是JavaScript、Python或其他编程语言的主脚本。这个文件通常包含了项目的启动逻辑,如初始化密码生成器实例、设置默认参数、...

    acl-fnd-lab-04a-calculator-refactor

    在压缩包文件"acl-fnd-lab-04a-calculator-refactor-main"中,我们可以推测它包含的主要文件和目录可能是: 1. HTML文件:计算器的界面代码,可能用简单的HTML元素如`&lt;form&gt;`,`&lt;input&gt;`和`&lt;button&gt;`来构建计算器的...

    hw1-code-refactor

    hw1-code-refactor 该存储库用于第1周HW1的代码重构家庭作业,代表第1周的代码重构是分配给github的第一份作业的头衔

    hw-01-code-refactor

    在"hw-01-code-refactor-main"这个目录下,可能包含着项目的主要源代码。代码重构可能涉及到对这些文件的调整,包括HTML结构的改善,JavaScript逻辑的优化,以及CSS样式的清理和重构。通过对HTML的重构,我们可以...

    Alone-Pre-Refactor:Fallen Advent的增量游戏

    从压缩包文件名称"Alone-Pre-Refactor-master"来看,"master"分支通常代表项目的主线或稳定版本。这意味着我们拿到的是这个游戏项目的主分支代码,包含了最新的开发成果和可能用于部署的代码。 深入研究这个项目,...

    Horizon-Code-Refactor

    在"Horizon-Code-Refactor-main"这个目录下,你将找到项目的具体实现,包括重构前后的代码对比,这将为你提供一个实践这些原则的实际场景。通过学习和实践,你不仅能提升HTML重构技巧,还能对整个网站的架构有更深入...

    react-query-blog-refactor-example:逐个提交的故事,它构建了自己的全局异步服务器状态管理,然后将其迁移到React Query

    关于 此回购示例说明了如何构建自己的服务器状态管理解决方案如何Swift变得复杂且难以维护,同时仍然无法满足作为React开发人员对服务器状态的许多期望。 每次提交都会添加更多功能来管理此服务器状态,直到获得...

    angular-forms-refactor

    在压缩包文件名“angular-forms-refactor-master”中,“master”通常表示这是项目的主分支,可能包含了最新的、稳定的代码版本。 关于Angular表单重构,我们可以考虑以下知识点: 1. **使用FormBuilder**: 如果...

    horiseon-code-refactor

    在"Horiseon-code-refactor"中,我们可以推测以下关键知识点: 1. **HTML基础**:HTML(超文本标记语言)是构建网页的基础,用于定义页面内容和结构。在重构过程中,理解HTML元素、属性和语义化标签(如、、、、和...

    javapns-json-refactor:2.2 版的 javajpns 分支,将 json 包重构为内部项目以避免与其他版本的 json 冲突

    在这个版本中,"javapns-json-refactor-master"可能包含了以下组件: 1. **源代码**:JavaPNS的核心类和接口,包括重构后的JSON处理代码。 2. **测试用例**:验证重构后功能的正确性和性能的测试代码。 3. **文档**...

    github-jobs-refactor:通过使用体系结构文件夹,全局样式,样式组件和复合组件来重构github作业项目

    在压缩包文件`github-jobs-refactor-main`中,我们可以预期找到该项目的主要源代码,包括组件、样式、配置文件以及可能的测试文件。通过阅读和分析这些文件,我们可以进一步了解重构的具体实现方式,以及如何有效地...

Global site tag (gtag.js) - Google Analytics