原文:优雅实现INotifyPropertyChanged接口——利用Lambda表达式

参考文章

  在14年的时候,曾经读过上面的参考文章,不过当时并没有怎么理解,慢慢地也就将这篇文章忘诸脑后了。

  直到前几天突发奇想,研究如何用Lambda表达式作为构造函数的参数(详见此文),研究之后,突然联想到上文,于是自己就去把这个想法实现了一遍。

话不多说,上代码

1.基类代码

public class BaseTemplate : INotifyPropertyChanged

{

  public event PropertyChangedEventHandler PropertyChanged;

  public void NotifyChanges( string propertyName)

  {

    PropertyChanged( this, new PropertyChangedEventArgs(propertyName));

  }

}


2.基类的扩展方法

public static class BaseTemplateExtend

{

  public static void NotifyPropertyChanged<T, TProperty>(this T bt, Expression<Func<T, TProperty>> expression) where T: BaseTemplate

{

var propertyName = string.Empty;

   if ((expression.Body as UnaryExpression) != null)

  {

     propertyName = ((expression.Body as UnaryExpression).Operand as MemberExpression).Member.Name;

  }

  else if ((expression.Body as MemberExpression) != null)

  {

  propertyName = ((expression.Body as MemberExpression).Member.Name);

  }

  if (!string.IsNullOrEmpty(propertyName))

  {

bt.NotifyChanges(propertyName);

  }

}

}


3.实体类代码

public class TestTemplate : BaseTemplate

{

   string name = “”;

   public string Name

  {

     get { return name; }

      set

    {

      name = value;

      this.NotifyPropertyChanges(s => s.Name);

    }

  }

}


为什么要这样做?

1.微软提供的参考方案,NotifyPropertyChanges()函数里面的参数,采用的是硬编码。例如:NotifyPropertyChanges(“Name”);这样虽然很可以编译通过,但是却没办法保证我们传递参数为正确的属性名称,而且一旦属性名称发生改变,那么我们的相应代码都需要手工来修改!这么弱智的事情,我们显然要避免。

2.基类按照我这样设置好之后,其余的实体类只需要继承基类,就可以通过示例中的方式来简单、快捷、安全地实现INotifyPropertyChanged接口。

优雅实现INotifyPropertyChanged接口——利用Lambda表达式的更多相关文章

  1. Java核心技术-接口、lambda表达式与内部类

    本章将主要介绍: 接口技术:主要用来描述类具有什么功能,而并不给出每个功能的具体实现.一个类可以实现一个或多个接口. lambda表达式:这是一种表示可以在将来的某个时间点执行的代码块的简洁方法. 内 ...

  2. Lambda01 编程范式、lambda表达式与匿名内部类、函数式接口、lambda表达式的写法

    1 编程范式 主要的编程范式有三种:命令式编程,声明式编程和函数式编程. 1.1 命令式编程 关注计算机执行的步骤,就是告诉计算机先做什么后做什么 1.2 声明式编程 表达程序的执行逻辑,就是告诉计算 ...

  3. Java函数式编程:一、函数式接口,lambda表达式和方法引用

    Java函数式编程 什么是函数式编程 通过整合现有代码来产生新的功能,而不是从零开始编写所有内容,由此我们会得到更加可靠的代码,并获得更高的效率 我们可以这样理解:面向对象编程抽象数据,函数式编程抽象 ...

  4. 使用Java函数接口及lambda表达式隔离和模拟外部依赖更容易滴单测

    概述 单测是提升软件质量的有力手段.然而,由于编程语言上的支持不力,以及一些不好的编程习惯,导致编写单测很困难. 最容易理解最容易编写的单测,莫过于独立函数的单测.所谓独立函数,就是只依赖于传入的参数 ...

  5. Java8新特性:Function接口和Lambda表达式参考

    Lambda基本:https://blog.csdn.net/wargon/article/details/80656575 https://www.cnblogs.com/hyyq/p/742566 ...

  6. Java函数式接口与Lambda表达式

    什么是函数式接口? 函数式接口是一种特殊的接口,接口中只有一个抽象方法. 函数式接口与Lambda表达式有什么关系? 当需要一个函数式接口的对象时,可以提供一个lambda表达式. package l ...

  7. Java8函数式接口和Lambda表达式

    两者关系: Lambda表达式就是函数式接口(FunctionalInterface)实现的快捷方式,它相当于函数式接口实现的实例,因为在方法中可以使用Object作为参数,所以把Lambda表达式作 ...

  8. 接口和lambda表达式笔记

    接口 接口是双方,即服务提供方和想让它们的对象对服务是可用的那些类,之间约定的一种机制. 声明一个接口 public interface IntSequence{ //不提供实现,则该方法为抽象方法, ...

  9. C++使用模板、函数指针、接口和lambda表达式这四种方法做回调函数的区别比较

    在C++中,两个类之间存在一种关系,某个类需要另外一个类去完成某一个功能,完成了之后需要告知该类结果,这种最普通最常见的需求,往往使用回调函数来解决. 如题,我总结下来有这么四种方式可以完成这项功能, ...

随机推荐

  1. js进阶 11-16 jquery如何查找元素的父亲、祖先和子代、后代

    js进阶 11-16 jquery如何查找元素的父亲.祖先和子代.后代 一.总结 一句话总结:过滤或者查找的方法里面可以带参数进行进一步的选择. 1.parent()和parents()方法的区别是什 ...

  2. js中单引号和双引号的区别(html中属性规范是用双引号,js中字符串规定是用单引号)(js中单引号区别和php很像:单引号快,双引号可转义字符,双引号可解析变量)

    js中单引号和双引号的区别(html中属性规范是用双引号,js中字符串规定是用单引号)(js中单引号区别和php很像:单引号快,双引号可转义字符,双引号可解析变量) 一.总结 1.html中属性规范是 ...

  3. python opencv3 —— findContours

    findContours 是 opencv 下的轮廓提取函数. 1. api 分析 findContours(image, mode, method[, contours[, hierarchy[, ...

  4. QQ互联API接口失效,第三方网站的死穴

    最近2个月,用开源程序WeCenter搭建了一个社交问答网站. 为了方便用户注册,开通了QQ登录功能. 今天,突然发现QQ互联返回一直出现错误.     度娘了很久,发现大家都遇到这个问题了.Disc ...

  5. bootstrap如何把表单select input button弄在一行

    bootstrap很多折叠样式css都已经写好,可以直接用,很方便.但是,如果遇到一些bootstrap文档里面没有的例子,估计很多初学者都懵了,然后会折腾很久也未见得有效.今天主要讲如何把selec ...

  6. [React] Update Component State in React With Ramda Lenses

    In this lesson, we'll refactor a React component to use Ramda lenses to update our component state. ...

  7. Thinking in UML 学习笔记(二)——UML核心视图之用例图

    在UML中,需求模型又称为用例模型,它主要用于描述系统的功能性需求,即软件可以实现的功能,如登录.注册.入库.出库.查看库存报表.增加员工信息等.常规的用例建模一般包括两个组成部分:绘制用例图和编写用 ...

  8. [Git] Use git add --patch for better commit history and mitigating bugs

    Let's split our changes into separate commits. We'll be able to check over our changes before stagin ...

  9. C++ 程序延时处理的几种方法

    (—)使用_sleep()函数 例如:_sleep(200);//延时200毫秒 (二)使用delay(int time)函数 (需要自己实现,编译器里面没有) /// @brief      程序延 ...

  10. 【HDU5748】Bellovin

    Description Peter has a sequence  and he define a function on the sequence -- , where  is the length ...