您的位置:首页 > 编程语言 > C#

C# 反射通过GetCustomAttributes方法,获得自定义特性

2017-12-18 13:52 621 查看
http://blog.csdn.net/litao2/article/details/17633107

使用反射访问: 自定义属性的信息和对其进行操作的方法。

一、实例1

1、代码:

如:System.Attribute[] attrs=System.Attribute.GetCustomAttributes(typeof(FirstClass));

[csharp] view plain copy

namespace ConsoleApplication1

{

class Program

{

static void Main(string[] args)

{

PrintAuthorInfo(typeof(FirstClass));

PrintAuthorInfo(typeof(SecondClass));

PrintAuthorInfo(typeof(ThirdClass));

Console.ReadKey();

}

private static void PrintAuthorInfo(System.Type t)

{

System.Console.WriteLine("\n类型的 System.Type 对象是:{0}", t);

System.Attribute[] attrs = System.Attribute.GetCustomAttributes(t); //反射获得用户自定义属性

foreach (System.Attribute attr in attrs)

{

if (attr is Author)

{

Author a = (Author)attr;

System.Console.WriteLine(" 名称:{0}, 版本: {1:f}", a.GetName(), a.version);

}

}

}

}

[System.AttributeUsage(System.AttributeTargets.Class |

System.AttributeTargets.Struct,

AllowMultiple = true)

]//自定义特性类(应用特性的程序元素(是类或结构),程序元素可以指定多个特性)

public class Author : System.Attribute

{

string name;

public double version;

public Author(string name)

{

this.name = name;

version = 1.0; // Default value

}

public string GetName()

{

return name;

}

}

[Author("H. Ackerman")]

public class FirstClass

{

// ...

}

// No Author attribute

public class SecondClass

{

// ...

}

[Author("H. Ackerman"), Author("M. Knott", version = 2.0)]

public class ThirdClass

{

//程序元素可以指定多个特性

}

}

2、效果:



二、实例2

1、代码

[csharp] view plain copy

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Linq.Expressions;

using System.Collections.Specialized;

using System.Reflection;

using System.Data.Linq.Mapping;

namespace ConsoleApplication1

{

class Program

{

static void Main(string[] args)

{

PropertyInfo[] propertys = typeof(FirstClass).GetProperties();//返回FirstClass的所有公共属性

if (propertys != null && propertys.Length > 0)

{

foreach (PropertyInfo p in propertys)

{

object[] objAttrs = p.GetCustomAttributes(typeof(ColumnAttribute), true);//获取自定义特性

//GetCustomAttributes(要搜索的特性类型,是否搜索该成员的继承链以查找这些特性)

if (objAttrs != null && objAttrs.Length > 0)

{

ColumnAttribute attr = objAttrs[0] as ColumnAttribute;

Console.WriteLine("自定义特性Name:"+p.Name+", 元数据:"+attr);

}

};

}

Console.ReadKey();

}

}

public class FirstClass

{

private int _newsid = 0;

/// <summary>

/// 主键

/// </summary>

[Column(Name = "NewsId", DbType = "int", IsPrimaryKey = true, CanBeNull = false, IsDbGenerated = true)]

public int NewsId

{

get

{

return this._newsid;

}

set

{

this._newsid = value;

}

}

private string _newsimage = string.Empty;

/// <summary>

/// 资讯标题图片

/// </summary>

[Column(Name = "NewsImage", DbType = "varchar", IsPrimaryKey = false, CanBeNull = false, IsDbGenerated = false)]

public string NewsImage

{

get

{

return this._newsimage;

}

set

{

this._newsimage = value;

}

}

}

}

2、效果



其他:

FullName(获得System.Type的完全限定名,包括命名空间)



三、实例3 (设置指定实例 属性 的值)

[csharp] view plain copy

FirstClass fClass = new FirstClass();

PropertyInfo pInstance = typeof(FirstClass).GetProperty("NewsId");//搜索具有指定名称的公共属性

pInstance.SetValue(fClass, 11, null);//设置指定实例 属性 的值

Console.WriteLine("新闻ID:"+fClass.NewsId);

Console.WriteLine("新闻图片:"+fClass.NewsImage);



//在4px的库内操作获取打印机

trv_LabelInvoice.Nodes.Clear();

string strText = string.Empty;
FieldInfo[] fields = typeof(EnumPrintName).GetFields();
foreach (FieldInfo field in fields)
{
strText = field.Name;

object[] arrAttributes = field.GetCustomAttributes(typeof(Attribute), true);
if (arrAttributes != null)
{
EnumAttribute objEnumAttribute = arrAttributes.FirstOrDefault(x => x.GetType().Name.Equals(typeof(EnumAttribute).Name)) as EnumAttribute;
if (objEnumAttribute != null)
{
strText = objEnumAttribute.Description;
}
}

if (trv_LabelInvoice.Nodes.IndexOfKey(field.Name) < 0)
{
trv_LabelInvoice.Nodes.Add(field.Name, strText);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: