[Obsolete("过时的",false)]//特性,标明XXX已过时
static void sendMessage()
{
Console.WriteLine("null");
}
static void sendMessage(string str)
{
Console.WriteLine(str);
}
static void Main(string[] args)
{
sendMessage(); //编译时,这里会有一个警告
sendMessage("hhaha");
Console.Read();
}
以上,静态方法sendMessage,上面[Obsolete("过时的",false)]/即是特性的应用,警示用户此方法过期。
我们现在知道了特性用的位置,下面看怎么定义特性,定义好的特性怎么用。
特性的定义,先看下Obsolete特性是怎么定义的。
可以发现和定义普通的类没有区别,只是继承自Attribute,并且上面有3个特性修饰,分别为
[Serializable] 一个类可否被序列化,不能被继承;
[ComVisible(true)]控制程序集中类型或成员对COM的可访问性,不能被继承;
[AttributeUsage]定义特性适用的范围,能否被继承,可否重复添加等信息,最主要的元元特性,不能被继承。
//下面这个例子,定义一个特性类,一个普通类(属性应用了定义的特性),获取普通类的所有属性和属性上的特性描述!
namespace ConsoleApplication1
{
[AttributeUsage(AttributeTargets.All, Inherited =true, AllowMultiple =false)]
public class DescriptionAttribute : Attribute
{
private string description;
private string name;
private string id;
public DescriptionAttribute() { }
public DescriptionAttribute(string description)
{
this.description = description;
}
public string Description
{
get
{
if (string.IsNullOrEmpty(this.description))
{
return "无描述";
}
return this.description;
}
}
public string ID
{
get
{
return id;
}
set
{
this.id = value;
}
}
public string Name
{
get
{
return name;
}
set
{
this.name = value;
}
}
}
class MyClass
{
[Description("我的第一个属性", ID ="001", Name ="第一个属性")]
public string DesOne { get; set; }
[Description(ID = "002", Name = "这个属性没有描述")]
public string DesTwo { get; set; }
}
class Program
{
static void Main(string[] args)
{
Type t = typeof(MyClass);
PropertyInfo[] properties = t.GetProperties();//获取得到类的所有属性
Console.WriteLine(t.Name +"类型的属性信息如下:");
foreach (PropertyInfo itemin properties)
{
Console.WriteLine("名称:" + item.Name);
Console.WriteLine("类型:" + item.PropertyType);
Console.WriteLine("属性:" + item.Attributes);
object[] Records = item.GetCustomAttributes(typeof(DescriptionAttribute),false);
foreach (DescriptionAttribute recordin Records)
{
Console.WriteLine(" 描述:" + record.Description);
Console.WriteLine(" ID:" + record.ID);
Console.WriteLine(" Name:" + record.Name);
}
Console.WriteLine("----------next----------------");
}
Console.Read();
}
}
}
//根据获取属性的方法,备忘下反射经常用的一些知识。
1. 反射的作用:可以遍历、查看程序集,类型的信息及其成员信息;迟绑定方法、属性;动态创建类型实例,动态调用类型实例的方法、属性、字段等。
2. 获取Type对象的实例。
1)使用GetType方法。Type mm ="rxm".GetType();
2)使用typeof方法。 Type t = typeof(MyClass);
3)使用GetType静态方法。Type tm = Type.GetType("System.String");
3. MemberInfo是方法,属性,事件,字段等等Info的基类,我们通过GetMembers()获取的集合,可通过MemberTypes标记的信息进行区分。
[Flags]
public enum MemberTypes {
Constructor = 1, // 该成员是一个构造函数
Event = 2, // 该成员是一个事件
Field = 4, // 该成员是一个字段
Method = 8, // 该成员是一个方法
Property = 16, // 该成员是一个属性
TypeInfo = 32, // 该成员是一种类型
Custom = 64, // 自定义成员类型
NestedType = 128, // 该成员是一个嵌套类型
All = 191, // 指定所有成员类型。
}
4. 反射程序集
System.Reflection命名空间下的Assembly类型,他代表了一个程序集,并包含了程序集的信息。
Assembly sem = Assembly.LoadFrom(@"E:gongxiangMCS.Library.dll");
Assembly semT = Assembly.LoadFrom("MCS.Library.dll");
Assembly semO = Assembly.Load(@"MCS.Library");
Assembly semN = Assembly.GetExecutingAssembly();//获取当前程序集
Type t = typeof(MyClass);
Assembly semMy = t.Assembly; //通过类型实例获取程序集
获取程序集后,可通过实例的属性、方法等获取自己想要的信息。