`
csstome
  • 浏览: 1476733 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

C#中的属性类

阅读更多

这个问题来自论坛提问,对于初学者来说确实比较陌生,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

然后新建一个窗体2,继承自窗体1

public partial class Form2:Form1

然后把Form2切换到设计器的模式,然后双击Form2的工作区域,会直接定位到代码的

private void Form2_FormClosed( object sender,FormClosedEventArgse)
... {

}

而不是先前的

private void Form2_Load( object sender,EventArgse)
... {
}

对于这个语法比较好奇的朋友请仔细阅读上面msdn的参考文档.

简要的说他不是系统规定死的写法,是属性类,

  1. 可以在运行期去决定做什么,就像一般的类.
  2. 除了系统已经定义的还可以自己定义.
  3. 中括号中的语法其实就是一个类的构造函数的调用.
  4. 我们可以通过反射得到属性类的实例.
  5. 属性类可以修饰类,变量,属性,成员函数,事件等

运行下面的测试代码,可能更加直观的理解他,下面展现了如何自己定义属性类并使用.

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( " jinjazzforTestClass " )]
[Test2(
12356 )]
public class TestClass
... {
// 给字段和属性测试
[Test1( " jinjazzfor_aa字段 " )]
public string _aa = "" ;
[Test1(
" jinjazzforaa属性 " )]
public string aa
... {
get ... { return _aa;}
}


// 给方法和事件测试
[Test1( " jinjazzfortest方法 " )]
public void test() ... {}
[Test1(
" jinjazzforonTest事件 " )]
public event System.EventHandleronTest;
}

}

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics