C# 反射通过GetCustomAttributes方法,获得自定义特性
2017-12-18 13:52
621 查看
http://blog.csdn.net/litao2/article/details/17633107
使用反射访问: 自定义属性的信息和对其进行操作的方法。
如: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、效果:
[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);
}
}
使用反射访问: 自定义属性的信息和对其进行操作的方法。
一、实例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 copyFirstClass 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);
}
}
相关文章推荐
- C# 反射通过GetCustomAttributes方法,获得自定义特性
- C# 反射通过GetCustomAttributes方法,获得自定义特性
- c#反射中GetMethods()和GetCustomAttributes()方法
- C#反射的GetCustomAttributes方法
- c#通过反射获取类上的自定义特性
- java反射通过get方法获得属性值
- java 反射通过get方法获得属性值
- c#通过反射获取类上的自定义特性
- GetCustomAttributes获得自定义属性
- c#通过反射获取类上的自定义特性
- StructLayoutLayout 属性无法通过GetCustomAttributes 或者 Attributes获得
- java 反射通过get方法获得属性值
- c#通过反射获取类上的自定义特性
- C# 通过反射获取MVC Controller里的类名,方法名,参数列表,返回值类型,Description描述,自定义Attribute
- c#通过反射获取类上的自定义特性
- c#通过反射获取类上的自定义特性
- java 反射通过get方法获得属性值
- C#通过反射让Request对象只读属性可写的方法
- 02_3中方式的反射,通过Class.forName获得Class对象,通过类.class获得字节码对象,通过类实例.getClass()的方式获得Class对象
- 【C#】通过反射调用某类某方法