当前位置: 首页 > news >正文

C# 如何实现对“属性”的扩展

目录

    • 一、为什么要扩展属性
    • 二、如何做?

一、为什么要扩展属性

属性是一个类的特征,随着开发的不断升级,这种特征可能在一直变化,有时候为了向下兼容,一般属性的数量都是直接递增的。

例如:一个Person类,他在项目初期,只有一个属性Age,可随着项目升级,可能需要Name,Address,甚至Price。

public class Person
{/// <summary>/// 年龄/// </summary>public int Age { get; set; }//常规属性
}

那么常规做法就是继承,然后在子类添加属性。亦或者修改源码,重新编译。

无论哪一种都有很大的麻烦事。

继承,会让显式的Person类无法使用声明到子类的属性,到时候必须进行强制转换,而一旦继承分支多起来的话,将非常糟糕。

而重新编译,带来的问题就更大了,总不能把属性都声明在父类吧。何况还有dll版本依赖问题,同事推脱问题,巴拉巴拉。

二、如何做?

我们可以在一开始,就将Person类按如下声明。继承DependencyObject。这里需要你先安装TouchSocket的库。

public class Person : DependencyObject
{/// <summary>/// 年龄/// </summary>public int Age { get; set; }//常规属性
}

然后,就Ok了。当后续你需要什么属性的时候,自己声明扩展即可。

这样,你就可以随意的往Person类中添加属性了。

public static class DependencyExtensions
{/// <summary>/// 依赖项/// </summary>public static readonly DependencyProperty<int> MyPropertyProperty2 =DependencyProperty<int>.Register("MyProperty2", typeof(DependencyExtensions), 10);/// <summary>/// 设置MyProperty2/// </summary>/// <typeparam name="TClient"></typeparam>/// <param name="client"></param>/// <param name="value"></param>/// <returns></returns>public static TClient SetMyProperty2<TClient>(this TClient client, int value) where TClient : IDependencyObject{client.SetValue(MyPropertyProperty2, value);return client;}/// <summary>/// 获取MyProperty2/// </summary>/// <typeparam name="TClient"></typeparam>/// <param name="client"></param>/// <returns></returns>public static int GetMyProperty2<TClient>(this TClient client) where TClient : IDependencyObject{return client.GetValue(MyPropertyProperty2);}
}

使用

Person person =new Person();
person.SetMyProperty2(2);//扩展属性必须通过扩展方法
int value=person.GetMyProperty2();

完工。

具体的使用细节可看TouchSocket依赖属性

http://www.lryc.cn/news/8769.html

相关文章:

  • EBS 物料属性 先后台对应关系 MTL_SYSTEM_ITEMS_B
  • MYSQL数据库-主从复制(原理及搭建)
  • 3GPP-NR Band25标准定义频点和信道(3GPP V17.7.0 (2022-12))
  • 微信小程序 之 原生开发
  • 常用vim命令和vim基本使用及Linux用户的管理,用户和组相关文件
  • 阿里云服务器部署前后端分离项目
  • 内核经典数据结构list 剖析
  • 华为OD机试 - 考优选核酸检测点(Python)| 真题+思路+考点+代码+岗位
  • 在魔改PLUS-F5280开发板上使用合封qsp iflash
  • uni-app 瀑布流
  • 华为OD机试 - 去除多余空格(Python)| 真题+思路+考点+代码+岗位
  • MyBatis 二级缓存简单使用步骤
  • kubeadmin kube-apiserver Exited 始终起不来查因记录
  • 论文投稿指南——中文核心期刊推荐(工程材料学)
  • 【动态规划】背包问题题型及方法归纳
  • 全球十大资质正规外汇期货平台排行榜(最新版汇总)
  • 使用Paramiko时遇到的一些问题
  • 数据预处理(无量纲化、缺失值、分类特征、连续特征)
  • 【C#基础】C# 运算符总结
  • 存储性能软件加速库(SPDK)
  • 微服务(五)—— 服务注册中心Consul
  • 冷冻电镜 - ChimeraX Density Map 密度图 操作
  • Matlab 点云旋转之轴角式
  • 2023美赛数学建模资料思路模型
  • Nginx配置HTTP强制跳转到HTTPS
  • 从实现到原理,聊聊Java中的SPI动态扩展
  • 3、MySQL字符集
  • 大漠插件最新中文易语言模块7.2302
  • 极客大挑战 2021
  • C#开发的OpenRA加载文件的管理