C#特性(Attribute)用法实例解析
C#中的特性(Attribute)是一种强大的元数据存储机制,广泛应用于程序集、类型、成员等元素上。本文将详细讲解如何运用特性,并演示如何通过继承Attribute类来自定义特性,结合反射技术实现运行时逻辑验证,如字符串长度校验。
特性的应用范围
在C#程序中,特性可以应用于多种目标元素。除了程序集和模块外,常见的应用位置包括:
- 类型:如类(Class)、结构体(Struct)、枚举(Enum)、接口(Interface)和委托(Delegate)
- 成员:字段(Field)、属性(Property)
- 方法:构造函数、普通方法及其返回值
- 参数:方法的输入参数
第1步:定义通用特性示例
首先,创建一个基础的特性类,展示其在不同目标上的应用方式。使用[AttributeUsage]指定该特性可用于所有目标。
[AttributeUsage(AttributeTargets.All)]
public class TestAttribute : Attribute
{
}
[TestAttribute] // 应用于结构
public struct TestStruct { }
[TestAttribute] // 应用于枚举
public enum TestEnum { }
// 应用于类及内部成员
[TestAttribute]
public class TestClass
{
[TestAttribute]
public TestClass() { }
[TestAttribute] // 字段
private string _testField;
[TestAttribute] // 属性
public string TestProperty { get; set; }
// 方法、参数及返回值
[TestAttribute]
[return: TestAttribute]
public string TestMethod([TestAttribute] string testParam)
{
throw new NotImplementedException();
}
}
自定义特性实现步骤
为了满足公共语言规范(CLS),所有自定义特性必须继承自System.Attribute。下面通过一个“字符串长度验证”的案例,演示自定义特性的完整开发流程。
第1步:定义特性类
创建StringLengthAttribute类,继承Attribute。使用AttributeUsage限制其仅能应用于属性(Property)。设计构造函数接收最大长度参数,并通过只读属性暴露该值。
[AttributeUsage(AttributeTargets.Property)]
public class StringLengthAttribute : Attribute
{
private int _maximumLength;
public StringLengthAttribute(int maximumLength)
{
_maximumLength = maximumLength;
}
public int MaximumLength
{
get { return _maximumLength; }
}
}
第2步:在实体类中应用特性
创建一个业务实体类People,并在其字符串属性上应用自定义特性,指定不同的长度限制。
public class People
{
[StringLength(8)]
public string Name { get; set; }
[StringLength(15)]
public string Description { get; set; }
}
第3步:编写验证逻辑
利用反射技术在运行时读取特性信息并进行验证。核心步骤包括获取类型属性、检查是否定义了特定特性、提取特性参数值以及对比实际数据。
public class ValidationModel
{
public void Validate(object obj)
{
var t = obj.GetType();
// 获取所有公共属性
var properties = t.GetProperties();
foreach (var property in properties)
{
// 检查是否存在[StringLength]特性
if (!property.IsDefined(typeof(StringLengthAttribute), false))
continue;
var attributes = property.GetCustomAttributes();
foreach (var attribute in attributes)
{
// 获取特性中定义的最大长度
var maxinumLength = (int)attribute.GetType()
.GetProperty("MaximumLength")
.GetValue(attribute);
// 获取当前对象的属性值
var propertyValue = property.GetValue(obj) as string;
if (propertyValue == null)
throw new Exception("属性值为空");
if (propertyValue.Length > maxinumLength)
throw new Exception(string.Format(
"属性{0}的值{1}的长度超过了{2}",
property.Name, propertyValue, maxinumLength));
}
}
}
}
第4步:执行验证测试
在Main方法中实例化对象并触发验证。当Name字段的值超过设定的8个字符限制时,系统将抛出异常。
private static void Main(string[] args)
{
var people = new People()
{
Name = "qweasdzxcasdqweasdzxc", // 长度超8
Description = "description"
};
try
{
new ValidationModel().Validate(people);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
Console.ReadLine();
}
以上就是C#特性(Attribute)用法实例解析的详细内容,更多关于C#元数据编程的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









