C#特性:从自定义一个特性开始,谈谈什么是特性
- 作者: 五速梦信息网
- 时间: 2026年04月04日 13:48
作为C#新手中的一员,我刚开始接触特性时,那真是一脸冏逼啊,怎么想怎么查资料都没弄明白它到底是个什么东西,有的入门教程甚至都没讲特性和反射这些概念!相信很多人第一次接触到特性就是关于系列化的知识了。
官方概述:
特性提供功能强大的方法,用以将元数据或声明信息与代码(程序集、类型、方法、属性等)相关联。 特性与程序实体关联后,即可在运行时使用名为“反射”的技术查询特性。
Serializable
自定义一个特性
MyAttribute
[AttributeUsage(AttributeTargets.Class,AllowMultiple=false,Inherited=false)]
public class MyAttribute : Attribute //类名是特性的名称
{
public float Version;//命名参数
private string Name;
public MyAttribute(string name) //name为定位参数
{
this.Name = name;
this.Version = 1.0f;
}
}
如何创建一个自定义特性:
[Serializable]
应用特性
下面来应用该特性:
[My("srf", Version = 1.2f)]
class Test11
{
public float n;
public Test11()
{
}
public void PrintName()
{
}
}
[My("srf", Version = 1.2f)]SerializableSerializableAttributeMyMyAttribute
关联特性
利用反射的原理,关联特性类与目标类型(反射:主要利用Type类的属性和方法来获得一个目标类型的类型信息对象,然后根据该对象可以得到目标类型的信息,如它的字段、属性、方法名、类名等,有了这些信息,下一步就可以为所欲为了,可以还原该类型,即反系列化,甚至创建一个新类型)
如下代码:
//1.判断Test11类定义时,是否应用了该特性
if (typeof(Test11).IsDefined(typeof(MyAttribute),false))
{
//2.获得该特性对象,之后就可以访问它的成员(元数据)
MyAttribute attribute = (MyAttribute)Attribute.GetCustomAttribute(typeof(Test11), typeof(MyAttribute));
attribute.Version = 1.3f;
}
当编译器发现一个特性应用到一个目标,并发生关联时:
- 首先会把"Attribute"追加到特性的名称(若使用了简写),形成完整的特性类名
- 然后在其所有引入的命名空间中搜索该特性类,若找不到该类或它与目标不匹配,则产生编译错误
- 检查传递给特性的参数,并查找该特性中带定位参数的构造函数(或无参构造函数)和其它可选的命名参数(特性类的公共字段、属性),若找到匹配的构造函数,则实例化该特性类,编译器还会把目标类型的元数据传递给程序集,反射可以从程序集中读取元数据,找不到则产生编译错误。
关联代码可以定义在目标类型内部:
[My("srf", Version = 1.2f)]
class Test11
{
public float n;
public Test11()
{
}
public void PrintName()
{
//1.判断是否应用了该特性
if (this.GetType().IsDefined(typeof(MyAttribute),false))
{
//2.获得该特性对象,之后就可以访问它的成员
MyAttribute attribute = (MyAttribute)Attribute.GetCustomAttribute(typeof(Test11), typeof(MyAttribute));
attribute.Version = 1.3f;
this.n = attribute.Version;
}
}
}
.NET预定义特性
SerializableAttribute[Serializable]
总之,特性其实没那么难,它就是一个类,或者说是一个用来服务于其它类型的类,一个目标类型应用了一个特性,那么这个目标类型就可以享受该特性提供的服务了!
以上纯属个人对特性的理解,有不对的地方请前辈们务必指正,以免误导!
- 上一篇: c#通过进程ID获取句柄
- 下一篇: C#鼠标移动到控件上的特效
相关文章
-
c#通过进程ID获取句柄
c#通过进程ID获取句柄
- 互联网
- 2026年04月04日
-
C#微信公众号开发系列教程二(新手接入指南)
C#微信公众号开发系列教程二(新手接入指南)
- 互联网
- 2026年04月04日
-
C#微信公众号开发系列教程三(消息体签名及加解密)
C#微信公众号开发系列教程三(消息体签名及加解密)
- 互联网
- 2026年04月04日
-
C#鼠标移动到控件上的特效
C#鼠标移动到控件上的特效
- 互联网
- 2026年04月04日
-
c#属性和字段的区别
c#属性和字段的区别
- 互联网
- 2026年04月04日
-
C#实现某一属性值变化时触发事件
C#实现某一属性值变化时触发事件
- 互联网
- 2026年04月04日






