依赖属性
一、说明
用过WPF的小伙伴一定对依赖属性不陌生。所以TouchSocket模仿其结构,创建了适用于网络框架的依赖属性。
二、什么是依赖属性?
我们知道常规属性,就是拥有get,set访问器的字段,叫做属性。
class MyClass
{
public int MyProperty { get; set; }
}
而依赖属性,则是具有注入特征的属性。它具有如下特性:
- 可以像普通属性一样,声明在类内部(示例1),对外界的公布和常规数据一模一样。
- 声明在静态类中,做成扩展方法,实现真正的注入型属性(示例2)。
- 可以声明初始值。
2.1 内部声明
- 继承DependencyObject
- 按如下格式生成属性项(propdp代码块可快速实现)
class MyDependencyObject: DependencyObject
{
/// <summary>
/// 属性项
/// </summary>
public int MyProperty1
{
get { return GetValue(MyPropertyProperty1); }
set { SetValue(MyPropertyProperty1, value); }
}
/// <summary>
/// 依赖项
/// </summary>
public static readonly DependencyProperty<int> MyPropertyProperty1 =
DependencyProperty<int>.Register("MyProperty1", typeof(MyDependencyObject), 10);
}
2.2 扩展声明
扩展声明,必须要提前声明扩展类。
下列示例声明一个MyProperty的属性扩展。
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);
}
}
那么这时候,MyDependencyObject对象即可赋值和获取MyProperty2的属性。
MyDependencyObject obj=new MyDependencyObject();
obj.SetMyProperty2(2);//扩展属性必须通过扩展方法
int value=obj.GetMyProperty2();
提示
扩展的SetMyProperty2和GetMyProperty2不是必须的。如果没有这两个方法,我们依然可以使用GetValue和SetValue方法访问。
MyDependencyObject obj=new MyDependencyObject();
obj.SetValue(DependencyExtensions.MyPropertyProperty2,2);
int value=obj.GetValue(DependencyExtensions.MyPropertyProperty2);
三、场景
假设以下情况: 有一个Person类,已经被封装好了,甚至已经被编译成dll了。但是他只有一个Age属性,如果我们想在开发后期再添加属性,应该怎么办呢?