代码改变世界

C#类特性和属性学习(转载)

2010-03-01 09:54  爱研究源码的javaer  阅读(294)  评论(0编辑  收藏  举报
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
  
using System.Reflection;
  
namespace ConsoleApplication6
{
    /// <summary>
    /// AttributeTargets.Class可以对类应用属性
    /// Inherited能否由派生类或重写成员继承
    /// AllowMultiple能否为一个程序元素指定多个指示属性实例
    /// 也就是说AllowMultiple=false 对于一个类型,该特性只能用一次
    /// 若一个Class类型前面出现多个TableAttribute,则会出现编译错误
    /// </summary>
    [AttributeUsage(AttributeTargets.Class,Inherited=true,AllowMultiple=false)]
    public class TableAttribute : Attribute
    {
        private string _tableName;
        public TableAttribute()
        {
   
        }
        public TableAttribute(string tableName)
        {
            this._tableName = tableName;
        }
        public string TableName
        {
            get
            {
                return this._tableName;
            }
            set
            {
                this._tableName = value;
            }
        }
    }
    /// <summary>
    /// 列特性
    /// AttributeTargets.Property可以对属性应用特性
    /// </summary>
    [AttributeUsage(AttributeTargets.Property,Inherited=false,AllowMultiple=false)]
    public class ColumAttribute : Attribute
    {
        private string _columName;
        private DbType _dbType;
  
        public ColumAttribute()
        {
   
        }
        public ColumAttribute(string columName)
        {
            this._columName = columName;
        }
        public ColumAttribute(string columName, DbType dbType)
        {
            this._columName = columName;
            this._dbType = dbType;
        }
        public string ColumName
        {
            get
            {
                return this._columName;
            }
            set
            {
                this._columName = value;
            }
        }
        public DbType DbTypeAttr
        {
            get
            {
                return this._dbType;
            }
            set
            {
                _dbType = value;
            }
        }
    }
  
    [Table("User")]
    public class User
    {
        [Colum("userId",DbType.Int32)]
        public int UserId { get; set; }
        [Colum("userName", DbType.String)]
        public string UserName { get; set; }
    }
  
    class Program
    {
        static void Main(string[] args)
        {
            User u = new User();
            u.UserId = 6;
            u.UserName = "allen";
  
  
            Type myObjType = u.GetType();
            Dictionary<string,string> columName = new Dictionary<string,string>();
            //获取自定义特性
            object temp = myObjType.GetCustomAttributes(typeof(TableAttribute),false).First();
            TableAttribute myAttr = temp as TableAttribute;
            Console.WriteLine("表名:{0}", myAttr.TableName);
  
            Console.WriteLine("列的名称和值:");
            foreach (PropertyInfo pi in myObjType.GetProperties())
            {
                object attr = pi.GetCustomAttributes(false).First();
                ColumAttribute cattr = attr as ColumAttribute;
                Console.WriteLine("{0}:{1}",cattr.ColumName,pi.GetValue(u,null));
            }
  
            Console.ReadKey();
  
        }
    }
}
转自:http://www.cnblogs.com/liulun/archive/2010/02/25/1673324.html