这个问题来自论坛提问,对于初学者来说确实比较陌生,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的参考文档.
简要的说他不是系统规定死的写法,是属性类,
- 可以在运行期去决定做什么,就像一般的类.
- 除了系统已经定义的还可以自己定义.
- 中括号中的语法其实就是一个类的构造函数的调用.
- 我们可以通过反射得到属性类的实例.
- 属性类可以修饰类,变量,属性,成员函数,事件等
运行下面的测试代码,可能更加直观的理解他,下面展现了如何自己定义属性类并使用.
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;
}
}
分享到:
相关推荐
### C# 数据实体类中如何给属性赋值 在C#开发中,处理数据库查询结果时,经常需要将查询结果映射到实体类中。本文将详细介绍如何在C#的数据实体类中为属性赋值,特别是当从数据库中取出的是一个`DataSet`对象时。 ...
C#属性及类的简单实用
C#遍历类的属性,这个主要用到C#的反射,该技术是每个开发者必备的,必须熟悉,可以信手拈来的技能,熟练后,让你以后的开发之旅,一路靓丽。
C# 中的属性是类中的一个成员,它可以是一种简单的数据存储方式,也可以是一个复杂的逻辑处理机制。在本文中,我们将重点讨论 C# 中的常规属性和自动实现属性的区别。 常规属性 一个完整的常规属性由三个部分构成...
在.NET框架中,C#提供了一种强大的机制,允许开发者扩展IDE(如Visual Studio)的属性编辑器功能,这就是UITypeEditor。通过自定义UITypeEditor,我们可以为控件、类或其他类型的属性创建定制的编辑界面,使得在设计...
在C#编程环境中,文件属性通常指的是与文件相关的元数据,包括但不限于文件名、创建日期、修改日期、访问日期、大小、类型等基础信息。然而,C#的标准库仅提供了修改部分基础属性的功能,如文件的隐藏、只读等属性。...
在.NET框架中,C#提供了一种强大的能力,即能够在运行时动态地创建程序集、类、属性和方法。这种技术通常被称为元编程或者反射,它允许开发者在代码执行过程中生成和修改代码,大大增强了软件的灵活性和可扩展性。在...
本文将详细介绍如何利用C#中的Lambda表达式和反射来实现一个功能:获取类属性的名称并返回string类型的结果。 ### C# 获取类属性名称 #### 代码解析 在提供的代码片段中,定义了一个名为`GetPropertyName`的静态...
C# 多个属性排序 List Dictionary 升序降序 可以同时包含升序降序 一个类中 按属性A降序 ,然后按属性B升序 ,最后按照属性C降序
在C#中,我们可以利用自定义特性(Attributes)来控制属性的显示方式和内容。例如,使用`DisplayNameAttribute`可以指定属性的显示名称,而`DescriptionAttribute`可以提供属性的描述性文本。 对于显示中文,我们...
本文将详细探讨如何在C#中显示文件属性信息以及如何利用C#提供的文件操作类进行各种文件操作。 首先,让我们了解一下C#中的`System.IO`命名空间,它是进行文件和目录操作的核心。在这个命名空间中,`FileInfo`类...
在C#编程语言中,类(Class)是面向对象编程的核心概念,它是创建对象的蓝图。类定义了一组相关的属性和方法,这些属性和方法共同描述了类的对象所能执行的操作和所具有的特性。 首先,让我们理解类的基本结构。一...
在C#编程中,属性控件(PropertyGrid)是一个非常实用的组件,它允许开发者创建类似于Visual Studio属性窗口的界面,用于展示和编辑对象的属性。这个控件可以帮助用户直观地查看和修改对象的公共属性,极大地提高了...
本文将深入探讨如何在C#中实现实体类和实体类集合的自动排序,以及如何将它们绑定到控件如DataGridView以支持排序功能。 首先,让我们了解什么是实体类。实体类是代表数据库表或服务API中的一个记录的类。它通常...
最近有遇到两个类之间的赋值问题,两个类的属性几乎都一样的,所以写了个通过反射获取属性的然后赋值的方法,把一个类的属性的值赋值给另一个类。 框架是.net 4.5 public static D Mapper(S s) { D d = Activator...
本话题将深入探讨如何自动生成C#类中的属性和方法的文档,以及涉及到的相关工具和技术。 一、XML注释与文档生成 C#支持XML注释,它允许程序员在代码中添加结构化的注释,这些注释可以被工具转换为格式化的文档。...
在C#编程语言中,属性(Properties)是类的一个重要组成部分,它们提供了访问类中私有数据成员的机制。属性可以被理解为类的公共接口,允许外部代码以受控的方式读取或设置私有变量的值。这样做既保证了数据的安全性...
C# 生成属性 封装字段 多个字段一起生成 C# 生成属性 封装字段 多个字段一起生成
首先,自定义属性是C#中一个强大的特性,允许我们在类中添加元数据,这些元数据可以用来提供额外的信息,如描述、默认值或验证规则。我们通过继承`Attribute`类来创建自定义属性。例如,我们可以创建一个名为`...
在C#中,一个JSON实体类通常是一个包含公共属性的类,这些属性与JSON对象的键值相对应。例如,如果有一个JSON对象`{"name": "John", "age": 30}`,对应的C#实体类可能是这样的: ```csharp public class Person { ...