这个问题来自论坛提问,对于初学者来说确实比较陌生,msdn参考文档
http://msdn.microsoft.com/zh-cn/library/system.attribute.aspx
我们先直观的表达一下他的作用之一:
比如一个自定义windows控件的DefaultEvent可以表示一个控件默认事件:
如你双击form他会默认到onLoad事件中,双击button,他会默认到onclick事件中。
一个简单的测试,你添加一个windows窗体1叫Form1,然后增加如下代码
[DefaultEvent(
"
FormClosed
"
)]
public partial class Form1 : Form
public partial class Form1 : Form
然后新建一个窗体2,继承自窗体1
public
partial
class
Form2 : Form1
然后把Form2切换到设计器的模式,然后双击Form2的工作区域,会直接定位到代码的
private
void
Form2_FormClosed(
object
sender, FormClosedEventArgs e)
{
}
{
}
而不是先前的
private
void
Form2_Load(
object
sender, EventArgs e)
{
}
{
}
对于这个语法比较好奇的朋友请仔细阅读上面msdn的参考文档.
简要的说他不是系统规定死的写法,是属性类,
- 可以在运行期去决定做什么,就像一般的类.
- 除了系统已经定义的还可以自己定义.
- 中括号中的语法其实就是一个类的构造函数的调用.
- 我们可以通过反射得到属性类的实例.
- 属性类可以修饰类,变量,属性,成员函数,事件等
运行下面的测试代码,可能更加直观的理解他,下面展现了如何自己定义属性类并使用.
using
System;
using System.Collections.Generic;
using System.Text;
namespace ConsoleApplication11
{
class Program
{
static void Main( string [] args)
{
// 获取类上的属性类
foreach ( object obj in typeof (TestClass).GetCustomAttributes( false ))
{
Console.WriteLine(obj.GetType().Name + " : " + obj.ToString());
}
// 获取字段属性类
foreach ( object obj in typeof (TestClass).GetField( " _aa " ).GetCustomAttributes( typeof (Test1), true ))
{
Console.WriteLine(obj.GetType().Name + " : " + obj.ToString());
}
// 获取属性属性类
foreach ( object obj in typeof (TestClass).GetProperty( " aa " ).GetCustomAttributes( typeof (Test1), true ))
{
Console.WriteLine(obj.GetType().Name + " : " + obj.ToString());
}
// 获取方法属性类
foreach ( object obj in typeof (TestClass).GetMethod( " test " ).GetCustomAttributes( typeof (Test1), true ))
{
Console.WriteLine(obj.GetType().Name + " : " + obj.ToString());
}
// 获取字事件性类
foreach ( object obj in typeof (TestClass).GetEvent( " onTest " ).GetCustomAttributes( typeof (Test1), true ))
{
Console.WriteLine(obj.GetType().Name + " : " + obj.ToString());
}
Console.Read();
}
}
// 测试属性类,传入string
public class Test1 : System.Attribute
{
string strName = "" ;
public Test1() { }
public Test1( string str)
{
strName = str;
}
public override string ToString()
{
return strName;
}
}
// 测试属性类,传入int
public class Test2 : Attribute
{
int _f;
public Test2( int f) { _f = f; }
public override string ToString()
{
return _f.ToString();
}
}
// 给class测试
[Test1( " jinjazz for TestClass " )]
[Test2( 12356 )]
public class TestClass
{
// 给字段和属性测试
[Test1( " jinjazz for _aa字段 " )]
public string _aa = "" ;
[Test1( " jinjazz for aa 属性 " )]
public string aa
{
get { return _aa; }
}
// 给方法和事件测试
[Test1( " jinjazz for test 方法 " )]
public void test() { }
[Test1( " jinjazz for onTest 事件 " )]
public event System.EventHandler onTest;
}
}
using System.Collections.Generic;
using System.Text;
namespace ConsoleApplication11
{
class Program
{
static void Main( string [] args)
{
// 获取类上的属性类
foreach ( object obj in typeof (TestClass).GetCustomAttributes( false ))
{
Console.WriteLine(obj.GetType().Name + " : " + obj.ToString());
}
// 获取字段属性类
foreach ( object obj in typeof (TestClass).GetField( " _aa " ).GetCustomAttributes( typeof (Test1), true ))
{
Console.WriteLine(obj.GetType().Name + " : " + obj.ToString());
}
// 获取属性属性类
foreach ( object obj in typeof (TestClass).GetProperty( " aa " ).GetCustomAttributes( typeof (Test1), true ))
{
Console.WriteLine(obj.GetType().Name + " : " + obj.ToString());
}
// 获取方法属性类
foreach ( object obj in typeof (TestClass).GetMethod( " test " ).GetCustomAttributes( typeof (Test1), true ))
{
Console.WriteLine(obj.GetType().Name + " : " + obj.ToString());
}
// 获取字事件性类
foreach ( object obj in typeof (TestClass).GetEvent( " onTest " ).GetCustomAttributes( typeof (Test1), true ))
{
Console.WriteLine(obj.GetType().Name + " : " + obj.ToString());
}
Console.Read();
}
}
// 测试属性类,传入string
public class Test1 : System.Attribute
{
string strName = "" ;
public Test1() { }
public Test1( string str)
{
strName = str;
}
public override string ToString()
{
return strName;
}
}
// 测试属性类,传入int
public class Test2 : Attribute
{
int _f;
public Test2( int f) { _f = f; }
public override string ToString()
{
return _f.ToString();
}
}
// 给class测试
[Test1( " jinjazz for TestClass " )]
[Test2( 12356 )]
public class TestClass
{
// 给字段和属性测试
[Test1( " jinjazz for _aa字段 " )]
public string _aa = "" ;
[Test1( " jinjazz for aa 属性 " )]
public string aa
{
get { return _aa; }
}
// 给方法和事件测试
[Test1( " jinjazz for test 方法 " )]
public void test() { }
[Test1( " jinjazz for onTest 事件 " )]
public event System.EventHandler onTest;
}
}