• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >C#教程 > C#属性(Attribute)用法实例解析

C#属性(Attribute)用法实例解析

作者: 字体:[增加 减小] 来源:互联网 时间:2017-05-28

通过本文主要向大家介绍了c#中attribute,c#getattribute,c#特性attribute,c#attribute,attribute属性等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

属性(Attribute)是C#程序设计中非常重要的一个技术,应用范围广泛,用法灵活多变。本文就以实例形式分析了C#中属性的应用。具体入戏:

一、运用范围

程序集,模块,类型(类,结构,枚举,接口,委托),字段,方法(含构造),方法,参数,方法返回值,属性(property),Attribute

[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();
    }
  }

</div>

这里我们给出了除了程序集和模块以外的常用的Atrribute的定义。 

二、自定义Attribute

为了符合“公共语言规范(CLS)”的要求,所有的自定义的Attribute都必须继承System.Attribute。

第一步:自定义一个检查字符串长度的Attribute

[AttributeUsage(AttributeTargets.Property)]
public class StringLengthAttribute : Attribute
{
  private int _maximumLength;
  public StringLengthAttribute(int maximumLength)
  {
    _maximumLength = maximumLength;
  }

  public int MaximumLength
  {
    get { return _maximumLength; }
  }
}

</div>

AttributeUsage这个系统提供的一个Attribute,作用来限定自定义的Attribute作用域,这里我们只允许这个Attribute运用在Property上,内建一个带参的构造器,让外部传入要求的最大长度。

第二步:创建一个实体类来运行我们自定义的属性

public class People
{
  [StringLength(8)]
  public string Name { get; set; }

  [StringLength(15)]
  public string Description { get; set; }
}

</div>

定义了两个字符串字段Name和Description, Name要求最大长度为8个,Description要求最大长度为15.

第三步:创建验证的类

public class ValidationModel
{

  public void Validate(object obj)
  {
    var t = obj.GetType();

    //由于我们只在Property设置了Attibute,所以先获取Property
    var properties = t.GetProperties();
    foreach (var property in properties)
    {

      //这里只做一个stringlength的验证,这里如果要做很多验证,需要好好设计一下,千万不要用if elseif去链接
      //会非常难于维护,类似这样的开源项目很多,有兴趣可以去看源码。
      if (!property.IsDefined(typeof(StringLengthAttribute), false)) continue;

      var attributes = property.GetCustomAttributes();
      foreach (var attribute in attributes)
      {
        //这里的MaximumLength 最好用常量去做
        var maxinumLength = (int)attribute.GetType().
          GetProperty("MaximumLength").
          GetValue(attribute);

        //获取属性的值
        var propertyValue = property.GetValue(obj) as string;
        if (propertyValue == null)
          throw new Exception("exception info");//这里可以自定义,也可以用具体系统异常类

        if (propertyValue.Length > maxinumLength)
          throw new Exception(string.Format("属性{0}的值{1}的长度超过了{2}", property.Name, propertyValue, maxinumLength));
      }
    }

  }
}

</div>

这里用到了反射,因为Attribute一般都会和反射一起使用,这里验证了字符串长度是否超过所要求的,如果超过了则会抛出异常

private static void Main(string[] args)
{
    var people = new People()
    {
      Name = "qweasdzxcasdqweasdzxc",
      Description = "description"
    };
    try
    {
      new ValidationModel().Validate(people);
    }
    catch (Exception ex)
    {
      Console.WriteLine(ex.Message);
    }
    Console.ReadLine();
}

</div>

希望本文所述实例对大家的C#程序设计能有一定的帮助作用。

</div>
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • C#属性(Attribute)用法实例解析

相关文章

  • 2017-05-28C# PLINQ 内存列表查询优化历程
  • 2017-05-28实例详解C#正则表达式
  • 2017-05-28C#实现安全删除文件目录的方法
  • 2017-05-28C# 合并GriewView相同列的小例子
  • 2017-05-28implicit关键字做自定义类型隐式转换的方法
  • 2017-05-28C#实现将商品金额小写转换成大写的方法
  • 2017-05-28c#注册表操作类分享
  • 2017-05-28通过LinQ查询字符出现次数的实例方法
  • 2017-05-28详解TreeView绑定数据库
  • 2017-05-28C#读取Excel的三种方式以及比较分析

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • 探秘C# 6.0 的新特性
    • C#使用DeflateStream解压缩数据文件的方法
    • C# MVC模式下商品抽奖功能实现
    • C#编写发送邮件组件
    • C#一个方法返回多个值示例
    • C#中枚举类型和radiobox关联操作的方法
    • C#实现移除字符串末尾指定字符的方法
    • C#入门之checked和unchecked的区别实例解析
    • C#操作windows注册表的方法
    • C#创建压缩文件的实现代码

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有