C#自定义Attribute举例!
using System;
namespace ConsoleApplication1
{
//定义枚举
[System.Flags()]
public enum AccountsE
{
Saveings=0x0001,
Checking=0x0002,
Brokerage=0x0004
}
//自定义特性
[System.AttributeUsage(AttributeTargets.Class)]
public class AccountsAttribute:Attribute
{
public AccountsE accounts;
public AccountsAttribute(AccountsE accounts)
{
this.accounts=accounts;
}
}
[ConsoleApplication1.Accounts(AccountsE.Saveings)]
class ChildAccount{}
[ConsoleApplication1.Accounts(AccountsE.Saveings|AccountsE.Checking|AccountsE.Brokerage)]
class AdultAccount{}
class Class1
{
[STAThread]
static void Main(string[] args)
{
CanWriteCheck(new ChildAccount());
CanWriteCheck(new AdultAccount());
CanWriteCheck(new Class1());
}
public static void CanWriteCheck(object obj)
{
//构造AccountsAttribute实例
AccountsAttribute checking=new AccountsAttribute(AccountsE.Checking);
//通过Attribute.GetCustomAttribute的静态方法来得到指定的特性的实例,然后就可以读取实例的属性了,用此来判断
//依据
Attribute validAccounts=Attribute.GetCustomAttribute(obj.GetType(),typeof(AccountsAttribute),false);
if (validAccounts!=null)
{
AccountsAttribute tmpAccounts=validAccounts as AccountsAttribute;
if((checking.accounts & tmpAccounts.accounts)==checking.accounts)
{
Console.WriteLine("{0} types can write checks.",obj.GetType());
}
else
{
Console.WriteLine("{0} type can not write checks.",obj.GetType());
}
}
else
{
Console.WriteLine("{0} type can not write checks.",obj.GetType());
}
}
}
}
namespace ConsoleApplication1
{
//定义枚举
[System.Flags()]
public enum AccountsE
{
Saveings=0x0001,
Checking=0x0002,
Brokerage=0x0004
}
//自定义特性
[System.AttributeUsage(AttributeTargets.Class)]
public class AccountsAttribute:Attribute
{
public AccountsE accounts;
public AccountsAttribute(AccountsE accounts)
{
this.accounts=accounts;
}
}
[ConsoleApplication1.Accounts(AccountsE.Saveings)]
class ChildAccount{}
[ConsoleApplication1.Accounts(AccountsE.Saveings|AccountsE.Checking|AccountsE.Brokerage)]
class AdultAccount{}
class Class1
{
[STAThread]
static void Main(string[] args)
{
CanWriteCheck(new ChildAccount());
CanWriteCheck(new AdultAccount());
CanWriteCheck(new Class1());
}
public static void CanWriteCheck(object obj)
{
//构造AccountsAttribute实例
AccountsAttribute checking=new AccountsAttribute(AccountsE.Checking);
//通过Attribute.GetCustomAttribute的静态方法来得到指定的特性的实例,然后就可以读取实例的属性了,用此来判断
//依据
Attribute validAccounts=Attribute.GetCustomAttribute(obj.GetType(),typeof(AccountsAttribute),false);
if (validAccounts!=null)
{
AccountsAttribute tmpAccounts=validAccounts as AccountsAttribute;
if((checking.accounts & tmpAccounts.accounts)==checking.accounts)
{
Console.WriteLine("{0} types can write checks.",obj.GetType());
}
else
{
Console.WriteLine("{0} type can not write checks.",obj.GetType());
}
}
else
{
Console.WriteLine("{0} type can not write checks.",obj.GetType());
}
}
}
}
一点说明:为什么在标题中要嵌入英文?原因是为了能够让国外的网友能查询到这篇文章。平常在Google上查资料的时候,经常参考国外网友的博客,帮助我解决了很多问题,所以我也想让他们能够参考我写的内容。当然文中我不可能全部译为英文,所以我尽量把代码粘全,靠代码说话吧。