.net使用自定义类属性实例

 一般来说,在.net中可以使用Type.GetCustomAttributes获取类上的自定义属性,可以使用PropertyInfo.GetCustomAttributes获取属性信息上的自定义属性。

 
下面以定义一个简单数据库表的映射实体类来说明相关的使用方法,基于自定义类属性和自定义类中的属性的自定义属性,可以方便的进行类标记和类中属性的标记
 
创建一个类的自定义属性,用于标识数据库中的表名称,需要继承自Attribute类:

 

代码如下:
[AttributeUsage(AttributeTargets.Class, Inherited = false, AllowMultiple = false)]
public sealed class TableAttribute : Attribute
{
        private readonly string _TableName = "";
        public TableAttribute(string tableName)
        {
            this._TableName = tableName;
        }
        public string TableName
        {
            get { return this._TableName; }
        }
}

 

创建一个属性的自定义属性,用于标识数据库表中字段的名称,需要继承自Attribute类:

 

 代码如下:
[AttributeUsage(AttributeTargets.Property, Inherited = false, AllowMultiple = false)]
public class FieldAttribute : Attribute
{
        private readonly string _FieldName = "";    ///数据库的字段名称
        private System.Data.DbType _Type = System.Data.DbType.String;   ///数据库的字段类型
 
        public FieldAttribute(string fieldName)
       {
              this._FieldName=fieldName;
       }
 
        public FieldAttribute(string fieldName,System.Data.DbType type)
       {
              this._FieldName=fieldName;
              this._Type=type;
       }
 
       public string FieldName
        {
            get { return this._FieldName; }
        }
 
        public System.Data.DbType Type
        {
             get{return this._Type;}
        }
}

 
创建一个数据实体基类:

 

 

代码如下:
public class BaseEntity
{
        public BaseEntity()
        {
        }
 
         /// <summary>
        /// 获取表名称
        /// </summary>
        /// <returns></returns>
        public string GetTableName()
        {
            Type type = this.GetType();
            object[] objs = type.GetCustomAttributes(typeof(TableAttribute), true);
            if (objs.Length <= 0)
            {
                throw new Exception("实体类没有标识TableAttribute属性");
            }
            else
            {
                object obj = objs[0];
                TableAttribute ta = (TableAttribute)obj;
                return ta.TableName;                            //获取表名称
            }
        }
        /// <summary>
        /// 获取数据实体类上的FieldAttribute
        /// </summary>
        /// <param name="propertyName"></param>
        /// <returns></returns>
        public FieldAttribute GetFieldAttribute(string propertyName)
        {
            PropertyInfo field = this.GetType().GetProperty(propertyName);
            if (field == null)
            {
                throw new Exception("属性名" + propertyName + "不存在");
            }
            object[] objs = field.GetCustomAttributes(typeof(FieldAttribute), true);
            if (objs.Length <= 0)
            {
                throw new Exception("类体属性名" + propertyName + "没有标识FieldAttribute属性");
            }
            else
            {
                object obj = objs[0];
                FieldAttribute fieldAttribute=(FieldAttribute)obj;
                fieldAttribute.FieldValue=field.GetValue(this,null);
                return fieldAttribute;
            }
        }
}

 
创建数据实体:

 

 

代码如下:
[Table("Wincms_Dictionary")]            ///映射到数据库的Wincms_Dictionary表
public class Wincms_Dictionary : BaseEntity
{
         private int _DictionaryId;
 
         public Wincms_Dictionary()
         {
         }
 
        [Field("DictionaryId",DbType.Int32)]                ///映射到数据库的Wincms_Dictionary表中的字段
        public int DictionaryId
        {
            get { return this._DictionaryId; }
            set
            {
                this._DictionaryId = value;
            }
        }
}
 
///基于实体类获取实体对应的表名称和字段名称
public class Test
{
 
       public static void main(string[] args)
        {
               Wincms_Dictionary dict=new Wincms_Dictionary();
               Console.WriteLine("表名称:"+GetTableName(dict));
               Console.WriteLine("字段名称:"+GetFieldName(dict,"DictionaryId"));
               Console.Read();
        }
 
       ///获取实体表名称
       public  static string GetTableName(BaseEntity entity)
       {
                return entity.GetTableName();
       }
 
       ///获取实体字段名称
       public static string GetFieldName(BaseEntity entity,string propertyName)
       {
              FieldAttribute fieldAttribute=entity.GetFieldAttribute(propertyName);
              return fieldAttribute.FieldName;
       }
}

输出结果为:

 

 

代码如下:
表名称:Wincms_Dictionary
字段名称:DictionaryId

时间: 2024-12-31 09:29:25

.net使用自定义类属性实例的相关文章

.net使用自定义类属性实例_实用技巧

一般来说,在.net中可以使用Type.GetCustomAttributes获取类上的自定义属性,可以使用PropertyInfo.GetCustomAttributes获取属性信息上的自定义属性.   下面以定义一个简单数据库表的映射实体类来说明相关的使用方法,基于自定义类属性和自定义类中的属性的自定义属性,可以方便的进行类标记和类中属性的标记   创建一个类的自定义属性,用于标识数据库中的表名称,需要继承自Attribute类: 复制代码 代码如下: [AttributeUsage(Att

内存分配-请问如何计算自定义类的实例的占用的空间?

问题描述 请问如何计算自定义类的实例的占用的空间? 例如定义一个Java类: public example{ public double[] instants = new double[100]; public int label; } 或者是一个C的struct: struct example { double instants[100]; int label; } 在以上两种情况下,这个类(或结构)的实例占用的内存是不是:100 * size of double + size of int?

Asp.net Web控件自定义类属性(经验篇)

asp.net|web|控件 做控件设计时,我们往往需要用自己定义的类来做为控件的属性, 但是,很不幸的是,IDE并不能预先知道新类别的诞生,因此,我们需要 有TypeConverter来做个转换,把自己定义的对象转换为字符串显示到控件 的属性页中,把属性页中的字符串(颜色在aspx中的体现也是字符串,如: #eef008)转换为自定义类.           TypeConverter实现步骤可以有以下两种方式:           一:套用系统定义的TypeConverter类,对自定义属性

PHP面向对象教程之自定义类_php实例

那怎么开始设计一个合格的类呢,一开始就写class{}的都错了,正确的是什么都不写,而是假设这个类已经存在,这个对象已经存在,各种属性方法都已经有了,在这个完全的假设下想象下这个对象应该怎么用,例如我们制作一个缩略图的类,我们希望封装成一个类,方便下次使用,我们首先需要明确对象是什么它会做什么,要制作缩略图本质操作是缩小图片并输出,这里被操作的是图片,那么对象就是图片,由于网站上的图片不是唯一的我们得告诉这是那张图片,这就可以假设下这个类已经存在,一开始就得声明是那张图片,例如$simg = n

c++-MFC在View.h中将CClientDC dc(this)中的dc作为参数传给自定义类,运行中断

问题描述 MFC在View.h中将CClientDC dc(this)中的dc作为参数传给自定义类,运行中断 View.h中: void CInteractiveDrawView::OnMouseMove(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default CClientDC dc(this); dc.SetROP2(R2_NOT);//设置绘图模式 switch

SpriteBuilder中不能编辑自定义类或不能给节点添加属性的解决

不能编辑自定义类 你选中一个Sub File(CCBFile)节点,在这个例子中,该节点的Custom class区域灰化禁用且不能修改.这是因为你需要在该Sub File引用的CCB文件中修改Custom class. 不能给节点添加通用属性 为了使一个节点拥有自定义属性,必须给其赋予一个自定义类(这个不一定,也可以用其通用父类作为自定义类).该自定义类需要的属性或实例变量与通用属性的名字相匹配.

Python类属性与实例属性用法分析

  本文实例分析了Python类属性与实例属性用法.分享给大家供大家参考.具体如下: 类属性:类名.属性名 实例属性:实例.属性名 ? 1 2 3 4 5 6 7 8 9 10 11 12 >>> class test(): ... ver=1 ... >>> a=test() >>> test.x=8 >>> a.__dict__ {} >>> a.x 8 >>> a.x=9 >>&g

抽象类-System.in输入流问题,in类成员属性实例化成为了InputStream

问题描述 System.in输入流问题,in类成员属性实例化成为了InputStream java中在System类中in字段被声明为InputStream类的实例化对象,但是InputStream类为抽象类 应该是无法别实例化的,为什么在System类中被实例化了呢? 解决方案 在System类中是这样定义in的. public final static InputStream in = nullInputStream(); nullInputStream是这样实现的: private sta

thinkPHP自定义类实现方法详解_php实例

本文实例讲述了thinkPHP自定义类实现方法.分享给大家供大家参考,具体如下: 1.通过Model调用 <?php /** * 积分模型 api接口 */ class ApiModel{ private $url = 'http://js.yunlutong.com/Customer/Interface'; public function test() { $post_data['action'] = 'sadf'; $post_data['callback'] = '?'; $res = r