首页 > 其他分享 >特性—[CallerMemberName]

特性—[CallerMemberName]

时间:2023-05-31 11:56:16浏览次数:41  
标签:CallerMemberName 特性 NotifyPropertyChanged 参数 名称 方法 属性

[CallerMemberName] 是 C# 中的一个特性(Attribute),用于在方法参数中标记一个字符串参数,用来自动获取调用该方法的成员名称(方法、属性、字段等)。

当在方法参数中使用了 [CallerMemberName] 特性时,如果该参数没有被显式地传入值,编译器会自动将调用方法的成员名称作为参数的默认值。这样,你就无需手动传入成员名称,而是可以直接使用方法的调用者的成员名称。

这个特性通常在实现属性更改通知(Property Change Notification)时非常有用。当你在属性的 setter 方法中调用属性更改通知事件时,可以使用 [CallerMemberName] 来自动获取当前属性的名称,避免手动传入属性名称字符串,减少了硬编码和重复代码。

例如,以下是一个简单的示例,展示了如何使用 [CallerMemberName] 特性:

 1 private string _name;
 2 
 3 public string Name
 4 {
 5     get { return _name; }
 6     set
 7     {
 8         if (_name != value)
 9         {
10             _name = value;
11             NotifyPropertyChanged(); // 调用属性更改通知方法
12         }
13     }
14 }
15 
16 public event PropertyChangedEventHandler PropertyChanged;
17 
18 protected void NotifyPropertyChanged([CallerMemberName] string propertyName = null)
19 {
20     PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
21 }

在上述示例中,当 Name 属性的值发生变化时,我们通过调用 NotifyPropertyChanged 方法来触发属性更改通知事件。由于在 NotifyPropertyChanged 方法的参数中使用了 [CallerMemberName],所以我们无需手动传入属性名称,编译器会自动将调用 NotifyPropertyChanged 方法的成员名称作为参数的默认值。这样,我们可以在整个类中重复使用该方法,而不必每次都手动传入属性名称。

让我们来详细解释这个例子的代码行:[CallerMemberName] string propertyName = null

  • [CallerMemberName]:这是特性的名称,告诉编译器要将该参数设置为调用者的成员名称。
  • string propertyName:这是参数的声明,指定了参数的类型为字符串,用于存储调用者的成员名称。
  • = null:这是一个默认值的赋值语句,指定了参数的默认值为 null。这意味着如果在调用 NotifyPropertyChanged 方法时未提供参数值,propertyName 参数将自动设置为 null

所以,当你调用 NotifyPropertyChanged 方法时,如果不传递 propertyName 参数的值,编译器将自动将调用该方法的成员名称赋值给 propertyName 参数。这样,你就可以在方法内部使用该成员名称进行属性更改通知,而无需手动指定属性的名称。

例如,如果在属性的 setter 方法中调用 NotifyPropertyChanged(),而没有显式传递参数值,propertyName 参数将自动设置为调用该 setter 方法的属性名称。

请注意,[CallerMemberName] 特性只能应用于方法的参数,并且要求参数类型为字符串。它不能应用于其他类型的参数或方法的返回值。

总而言之,[CallerMemberName] 特性提供了一种便捷的方式来获取方法的调用者的成员名称,通常在属性更改通知等场景下使用,减少了手动传入成员名称的工作量,提高了代码的可读性和可维护性。

标签:CallerMemberName,特性,NotifyPropertyChanged,参数,名称,方法,属性
From: https://www.cnblogs.com/kai-liang/p/17445711.html

相关文章

  • OpenHarmony 3.2 Release新特性解读之驱动HCS
     OpenAtom OpenHarmony(以下简称“OpenHarmony”)开源社区,在今年4月正式发布了OpenHarmony 3.2 Release版本,标准系统能力进一步完善,提升了系统的整体性能、稳定性和安全性。此次版本对于驱动也提供了一些新的特性,极大的方便了驱动开发工作。其中针对HCS文件开发提供新的开发......
  • ​Python 3 新特性:类型注解——类似注释吧,反正解释器又不做校验
    Python3新特性:类型注解Crossin上海交通大学计算机应用技术硕士95人赞同了该文章前几天有同学问到,这个写法是什么意思:defadd(x:int,y:int)->int:returnx+y我们知道Python是一种动态语言,变量以及函数的参数是不区分类型。因此我们定义函数只需要这样写就可以了:def......
  • 非对称纳米通道的整流特性研究及其在DNA检测中的应用
    非对称纳米通道的整流特性研究及其在DNA检测中的应用石晓雨西北大学摘要:纳米通道单分子检测技术具有方法简单、无需标签、实时监测的优点,在生物、化学领域受到广泛关注。与生物纳米通道相比,固态纳米通道孔径尺寸和形状可调,在各种条件(pH值、温度、浓度等)下均具有出色的......
  • JAVA三大特性
    封装把对象的属性和具体行为看成一个私有的不可见的整体,不允许被外部修改,但是提供访问接口这种对外简单使用,对内隐藏复杂性的形式符合高内聚低耦合的程序设计也提高了系统整体的可维护性典型的是使用private控制访问权限私有 继承父类可以有多个子类,子类只能有一个分类......
  • Java8的新特性
    Lambda表达式Lambda是一个匿名函数,我们可以把Lambda表达式理解为是一段可以传递的代码(将代码像数据一样传递)。使用它可以写出更简洁,更灵活的的代码。作为一种观念更紧凑的代码风格,使Java的语言表达能力得到了提升。//Lambda表达式的使用举例@Testpublicvoidtest1(){ Runnab......
  • form表单特性总结
    1.form属性<formid="user_form"method="get"></form><div>年龄:<inputname="age"form="user_form"></></div>外部元素可以与非父级表单关联表单提交,可以携带表单外部元素的值2.提交按钮的form相关属性包括formaction:覆盖fo......
  • 并发编程深入理解JMM&并发三大特性
    1并发编程三大特性可见性原子性有序性2JMM概念 java虚拟机规范中定义了java内存模型,用于屏蔽掉各种硬件和操作系统的内存访问差异,以实现java程序在各种平台下都能达到一致的并发效果。 jmm规范规定了java虚拟机与计算机内存是如何协同工作的:规定了一个线程如何及何......
  • 物联网的三大特性
    一般认为,物联网具有以下的三大特征:1.全面感知:利用RFID、传感器、二维码等随时随地获取物体的信息。2.可靠传递:通过无线网络与互联网的融合,将物体的信息实时准确地传递给用户。3.智能处理:利用云计算、数据挖掘以及模糊识别等人工智能技术,对海量的数据和信息进行分析和处理,对物体实......
  • Unity中的InitializeOnLoad特性:深入解析与实践
    Unity中的InitializeOnLoad特性:深入解析与实践在Unity开发过程中,我们经常需要在编辑器启动时或脚本重新编译后执行一些操作,例如初始化数据、注册事件等。这时,我们可以使用InitializeOnLoad特性来实现这一需求。本文将详细介绍InitializeOnLoad特性的用法,并通过三个实际案例来展示......
  • Numpy_矩阵的multiply_python的属性以及类特性_装饰器——@property_@classmethod_@st
    Python类中有三个常用的装饰器分别是@property(使一个方法可以被当成属性调用,常用于直接返回某一不想被修改的属性)@classmethod(将一个方法定义为类方法,其中第一个参数要修改为cls,使得该方法可以不用实例化即可被调用)@staticmethod(静态方法,类似于类方法,也可以不用实例化,......