一 使用Attribute的例子
1 用在类上的
[Serializable]
public sealed class String:IComparable,Iconeable,IConvertible,
Ienumerable
2 用再方法上的
[STAThread]
static void Main()
二 Attribute
Attribute 是与类、结构、方法等元素相关的额外信息,是对元信息的扩展。
通过Attribute可以使程序、甚至语言本身的功能得到增强。
[HelpUr]("http://SomeUr/APIDocs/SomeClass")
class SomeClass
{
[WebMethod]
void GetCustomers(){...}
string Test([SomeAttr]string param1){...}
}
三 使用系统定义的Attribute
1 使用Attribute的一般方式
① 在程序集、类、域、方法等前面用[]表示;
② 可以省略"Attribute"几个字母,只写xxxxx;
③ 可以带参数
位置参数(相当于构造方法带的参数);
命名参数(域名或属性名=值);
2 示例
① 在Main()方法使用[STAThread];
② 使用“过时”:AttributeObsolete.cs;
③ 使用“条件”:AttributeConditional.cs;
④ 在结构上、枚举上使用:StructLayout,Flag;
⑤ 在程序集级别应用Attribute;
[assembly:AssemblyCompany(“”)];
四 自定义Attribute
1 声明Attribute类
① 从System.Attribute继承而来;
② 名字要用xxxxAttribute;
2 使用Attribute类
① 在类即成员上面使用方括号;
② 可以省略后缀Attribute;
3 通过反射访问属性
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
namespace Attribute定义及使用
{
[AttributeUsage(AttributeTargets.Class
| AttributeTargets.Method,
AllowMultiple = true)]
public class HelpAttribute:System.Attribute
{
public readonly string Url;
private string topic;
public string Topic
{
get { return topic; }
set { topic = value; }
}
public HelpAttribute(string url)
{
this.Url = url;
}
}
[HelpAttribute("https://msvc/MyClassInfo",Topic ="Test"),
Help("https://my.com/about/class")]
class MyClass
{
[Help("https://my.com/about/method")]
public void MyMethod(int i)
{
return;
}
}
public class MemberInfo_GetCustomAttributes
{
public static void Main()
{
Type myType = typeof(MyClass);
object[] attributes = myType.GetCustomAttributes(false);
for(int i=0;i<attributes.Length;i++)
{
PrintAttributeInfo(attributes[i]);
}
MemberInfo[] myMembers = myType.GetMembers();
for (int i=0;i<myMembers.Length;i++)
{
Console.WriteLine("\nNumber{0}:", myMembers[i]);
Object[] myAttributes = myMembers[i].GetCustomAttributes(false);
for(int j=0;j<myAttributes.Length;j++)
{
PrintAttributeInfo(myAttributes[j]);
}
}
Console.ReadKey();
}
static void PrintAttributeInfo(object attr)
{
if(attr is HelpAttribute)
{
HelpAttribute attrh = (HelpAttribute)attr;
Console.WriteLine("----Url:" + attrh.Url + "Topic:" + attrh.Topic);
}
}
}
}