×

attributeusage get

attributeusage(get set如何用)

admin admin 发表于2022-09-02 04:52:49 浏览113 评论0

抢沙发发表评论

本文目录

get set如何用


你说的在C#里面叫做属性,也是C#所特有的。
下面是C#属性的解释。
C# 提供一种对称为属性的声明标记进行定义的机制。可以将属性置于源代码的某些实体上以指定附加信息。可以在运行时通过反射检索属性包含的信息。您可以使用预定义属性或者定义自己的自定义属性。
属性提供功能强大的方法以将声明信息与 C# 代码(类型、方法、属性等)相关联。与程序实体关联后,属性可在运行时查询,并可以以任意多种方式使用。
声明属性类
在 C# 中声明属性很简单:它采取从 System.Attribute 继承的类声明的形式,并已用 AttributeUsage 属性标记,如下所示:
using System;
[AttributeUsage(AttributeTargets.All)]
public class HelpAttribute : System.Attribute
{
public readonly string Url;
public string Topic // Topic is a named parameter
{
get
{
return topic;
}
set
{
topic = value;
}
}
public HelpAttribute(string url) // url is a positional parameter
{
this.Url = url;
}
private string topic;
}
代码讨论
属性 AttributeUsage 指定该属性可以应用于的语言元素。
属性类是从 System.Attribute 派生的公共类,至少有一个公共构造函数。
属性类有两种类型的参数:
“定位参数”,每次使用属性时都必须指定这些参数。定位参数被指定为属性类的构造函数参数。在上面的示例中,url 便是一个定位参数。
“命名参数”,可选。如果使用属性时指定了命名参数,则必须使用参数的名称。通过包含非静态字段或属性来定义命名参数。在上面的示例中,Topic 便是一个命名参数。
属性参数限制为下列类型的常数值:
简单类型(bool、byte、char、short、int、long、float 和 double)
string
System.Type
enums
对象(对象类型的属性参数的参数必须是属于上述类型之一的常数值。)
以上任意类型的一维数组

C# 求救关于不是特性类


放到vs2008当中,除这个.net 4.0新加的using System.Threading.Tasks;
空间外,其他的没有问题。
下面是测试代码,都可以正常编译。
你的问题是不是有其他的类编译不过去呢?仔细查看异常信息内容已经异常信息发生的位置,你可能会有收获。
public class Class1
{
[Information(“aa“, “bb“)]
public void TestAttribute()
{
}
}

c# 中括号(【】)代表什么


是 属性 Attributes ,请看 下面这篇文章: (或者看链接里的参考资料 版式好一点)
属性提供功能强大的方法以将声明信息与 C# 代码(类型、方法、属性等)相关联。与程序实体关联后,属性可在运行时查询,并可以以任意多种方式使用。
属性的用法示例包括:
将帮助文档与程序实体关联(通过 Help 属性)。
将值编辑器关联到 GUI 框架中的特定类型(通过 ValueEditor 属性)。
除一个完整的示例外,本教程还包括以下主题:
声明属性类
第一件需要做的事情是声明属性。
使用属性类
创建属性后,随即将属性与特定的程序元素关联。
通过反射访问属性
属性与程序元素关联后,即可使用反射查询属性存在及其值。
声明属性类
在 C# 中声明属性很简单:它采取从 System.Attribute 继承的类声明的形式,并已用 AttributeUsage 属性标记,如下所示:
1using System;
2[AttributeUsage(AttributeTargets.All)]
3public class HelpAttribute : System.Attribute
4{
5 public readonly string Url;
6
7 public string Topic // Topic is a named parameter
8 {
9 get
10 {
11 return topic;
12 }
13 set
14 {
16 topic = value;
17 }
18 }
19
20 public HelpAttribute(string url) // url is a positional parameter
21 {
22 this.Url = url;
23 }
24
25 private string topic;
26}
代码讨论
属性 AttributeUsage 指定该属性可以应用于的语言元素。
属性类是从 System.Attribute 派生的公共类,至少有一个公共构造函数。
属性类有两种类型的参数:
“定位参数”,每次使用属性时都必须指定这些参数。定位参数被指定为属性类的构造函数参数。在上面的示例中,url 便是一个定位参数。
“命名参数”,可选。如果使用属性时指定了命名参数,则必须使用参数的名称。通过包含非静态字段或属性来定义命名参数。在上面的示例中,Topic 便是一个命名参数。
属性参数限制为下列类型的常数值:
简单类型(bool、byte、char、short、int、long、float 和 double)
string
System.Type
enums
对象(对象类型的属性参数的参数必须是属于上述类型之一的常数值。)
以上任意类型的一维数组
AttributeUsage 属性的参数
属性 AttributeUsage 提供声明属性的基础机制。
AttributeUsage 具有一个定位参数:
AllowOn 指定可以将属性赋给的程序元素(类、方法、属性、参数等)。该参数的有效值可以在 .NET Framework 中的 System.Attributes.AttributeTargets 枚举中找到。该参数的默认值是所有程序元素 (AttributeElements.All)。
AttributeUsage 有一个命名参数:
AllowMultiple,一个布尔值,指示是否可以为一个程序元素指定多个属性。该参数的默认值为 false。
使用属性类
以下是使用上一节中声明的属性的简单示例:
1[HelpAttribute(“
1// AttributesTutorial.cs
2// This example shows the use of class and method attributes.
3
4using System;
5using System.Reflection;
6using System.Collections;
7
8// The IsTested class is a user-defined custom attribute class.
9// It can be applied to any declaration including
10// - types (struct, class, enum, delegate)
11// - members (methods, fields, events, properties, indexers)
12// It is used with no arguments.
13public class IsTestedAttribute : Attribute
14{
15 public override string ToString()
16 {
17 return “Is Tested“;
18 }
19}
20
21// The AuthorAttribute class is a user-defined attribute class.
22// It can be applied to classes and struct declarations only.
23// It takes one unnamed string argument (the author’s name).
24// It has one optional named argument Version, which is of type int.
25[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct)]
26public class AuthorAttribute : Attribute
27{
28 // This constructor specifies the unnamed arguments to the attribute class.
29 public AuthorAttribute(string name)
30 {
31 this.name = name;
32 this.version = 0;
33 }
34
35 // This property is readonly (it has no set accessor)
36 // so it cannot be used as a named argument to this attribute.
37 public string Name
38 {
39 get
40 {
41 return name;
42 }
43 }
44
45 // This property is read-write (it has a set accessor)
46 // so it can be used as a named argument when using this
47 // class as an attribute class.
48 public int Version
49 {
50 get
51 {
52 return version;
53 }
54 set
55 {
56 version = value;
57 }
58 }
59
60 public override string ToString()
61 {
62 string value = “Author : “ + Name;
63 if (version != 0)
64 {
65 value += “ Version : “ + Version.ToString();
66 }
67 return value;
68 }
69
70 private string name;
71 private int version;
72}
73
74// Here you attach the AuthorAttribute user-defined custom attribute to
75// the Account class. The unnamed string argument is passed to the
76// AuthorAttribute class’s constructor when creating the attributes.
77[Author(“Joe Programmer“)]
78class Account
79{
80 // Attach the IsTestedAttribute custom attribute to this method.
81 [IsTested]
82 public void AddOrder(Order orderToAdd)
83 {
84 orders.Add(orderToAdd);
85 }
86
87 private ArrayList orders = new ArrayList();
88}
89
90// Attach the AuthorAttribute and IsTestedAttribute custom attributes
91// to this class.
92// Note the use of the ’Version’ named argument to the AuthorAttribute.
93[Author(“Jane Programmer“, Version = 2), IsTested()]
94class Order
95{
96 // add stuff here
97}
98
99class MainClass
100{
101 private static bool IsMemberTested(MemberInfo member)
102 {
103 foreach (object attribute in member.GetCustomAttributes(true))
104 {
105 if (attribute is IsTestedAttribute)
106 {
107 return true;
108 }
109 }
110 return false;
111 }
112
113 private static void DumpAttributes(MemberInfo member)
114 {
115 Console.WriteLine(“Attributes for : “ + member.Name);
116 foreach (object attribute in member.GetCustomAttributes(true))
117 {
118 Console.WriteLine(attribute);
119 }
120 }
121
122 public static void Main()
123 {
124 // display attributes for Account class
125 DumpAttributes(typeof(Account));
126
127 // display list of tested members
128 foreach (MethodInfo method in (typeof(Account)).GetMethods())
129 {
130 if (IsMemberTested(method))
131 {
132 Console.WriteLine(“Member {0} is tested!“, method.Name);
133 }
134 else
135 {
136 Console.WriteLine(“Member {0} is NOT tested!“, method.Name);
137 }
138 }
139 Console.WriteLine();
140
141 // display attributes for Order class
142 DumpAttributes(typeof(Order));
143
144 // display attributes for methods on the Order class
145 foreach (MethodInfo method in (typeof(Order)).GetMethods())
146 {
147 if (IsMemberTested(method))
148 {
149 Console.WriteLine(“Member {0} is tested!“, method.Name);
150 }
151 else
152 {
153 Console.WriteLine(“Member {0} is NOT tested!“, method.Name);
154 }
155 }
156 Console.WriteLine();
157 }
158}
输出
Attributes for : Account
Author : Joe Programmer
Member GetHashCode is NOT tested!
Member Equals is NOT tested!
Member ToString is NOT tested!
Member AddOrder is tested!
Member GetType is NOT tested!
Attributes for : Order
Author : Jane Programmer Version : 2
Is Tested
Member GetHashCode is NOT tested!
Member Equals is NOT tested!
Member ToString is NOT tested!
Member GetType is NOT tested!
-attributeusage

property和attribute的区别


property是指类向外提供的数据区域。
而attribute则是描述对象在编译时或运行时属性的,分为固有型和用户自定义型,其中用户自定义型可以利用Reflection在运行期获取。
这两者是有本质区别的。
资料上说二者一个是service的属性,而另一个是interface的。
第一种好象更准确,摘要如下:
在很多人的脑海中,Attribute就是类的属性,Property呢?好像也是类的属性?因此有很多人不加区别的统一称为类的属性,尤其是在写中文文章的时候。这种心理是典型的鸵鸟心态,眼不见为净。其实稍微用脚想一下就知道,事实肯定不是这样的,UML中既然发明了这两个术语,显然不是用来冗余的。它们之间肯定有着千丝万缕的联系与区别。
各种各样的面向对象语言、各种组件技术、模板技术、Web Service技术,其中大部分涉及到了“属性”这个概念,而其英文术语则常常是Attribute、Property或者Field。很多人一概称之为“属性”,有的地方确实可以不加区分,但有的地方却是差之毫厘、谬以千里。我对于这些纷纷扰扰的技术和术语也很苦恼,但是我们至少可以通过UML中的这两个术语的解释找到一个可以参考的标准。无论如何,UML是面向对象技术的集大成者和事实上的标准。
很客观的说,UML1.4中对于这两个术语并没有很清晰的定义,但是其区别还是显而易见的。Attribute应该是UML1.4中的宠儿,而Property连一个单独的术语都没有捞到。谁也没想到在UML2.0中风云突变,Attribute从类图中消失了,而Property堂而皇之入主中原。
1。4中 Attribute是与Classifier相关联的术语,它比Property的影响范围要小。Class是Classifier的子类,因此Attribute也可以表示Class的属性。从上面的定义还可以看出,Attribute可以是Classifier的实例的命名的槽。对于Class来说,其实例就是Object,Object的槽就是对象的属性值槽。因此,Attribute是可以作为对象的属性的。而Property似乎没有这一层的含义。按MOF(元对象设施,OMG的另一个规范,后面会有详细解释)的模型层次划分,Attribute涉及的模型层从M2到M0,而Property似乎只是M2层的概念。
2。0中 Attribute这里仅仅指一个类元的结构特征,可以将类元的实例联系到一个或者一组具体值。而没有提到实例的槽(slot)等等。我猜想,这是因为UML2.0中已经把Attribute作为Property的一个子集了,所以关于实例的槽(slot)等等的具体赋值方法,都归结到Property的定义中解释了。
另外一点值得注意的是,Attribute的定义来自于术语表,而没有在元模型图中出现。而Property出现在元模型图中,并且都做了详细而具体的解释。这一点可以看出,UML强化Property,弱化Attribute的决心。
Attribute和Property的总结
这一节对Attribute和Property作一个小结,基于目前最新的UML2.0规范:
l 总体上来说,Attribute是Property的子集,Property会在适当的时机表现为Attribute;
l Property出现在类图的元模型中,代表了Class的所有结构化特征;Attribute没有出现在元模型中,它仅仅在Class的概念中存在,没有相应的语法了;
l Property有详细的定义和约束,而Attribute没有详细的定义,因此也不能用OCL写出其约束。
l Property和Attribute都是M2层的概念。在M1层,它们的实例是具体类的属性;在M0层,它们的实例的实例是具体对象的槽中存储的值。
对于property和attribute这两个名词都叫“属性”的问题,来源于国内it书籍翻译界的疏忽。
其实它们来源于两个不同的领域,attribute属于OOA/OOD的概念,而property属于编程语言中的概念。下面我们来说明它们的异同。
Attribute
Attributes是Microsoft .NET Framework文件的元数据,可以用来向运行时描述你的代码,或者在程序运行的时候影响应用程序的行为。
Property
属性是面向对象编程的基本概念,提供了对私有字段的访问封装,在C#中以get和set访问器方法实现对可读可写属性的操作,提供了安全和灵活的数据访问封装。关于属性的概念,不是本文的重点,而且相信大部分的技术人员应该对属性有清晰的概念。以下是简单的属性
区别
可以说两者没有可比性,只不过我们国家的语言特点才引起的歧异,其实只要记住Attribute是派生于System,Attribute类之下,它的主要作用是描述,比如某为了描述某个方法是来自与外部的dll,
可以写如下代码,这就是一个Attribute,他是一个描述(或者说声明)
[DllImport(“User32.dll“)]
Attribute也有很多系统的“默认”属性,见下表
预定义的属性

有效目标

说明
AttributeUsage

Class

指定另一个属性类的有效使用方式
CLSCompliant

全部

指出程序元素是否与CLS兼容
Conditional

Method

指出如果没有定义相关联的字符串,编译器就可以忽略对这个方法的任何调用
DllImport

Method

指定包含外部方法的实现的DLL位置
STAThread

Method(Main)

指出程序的默认线程模型为STA
MTAThread

Method(Main)

指出程序的默认模型为多线程(MTA)
Obsolete

除了Assembly、Module、Parameter和Return

将一个元素标示为不可用,通知用户此元素将被从未来的产品
ParamArray

Parameter

允许单个参数被隐式地当作params(数组)参数对待
Serializable

Class、Struct、enum、delegate

指定这种类型的所有公共和私有字段可以被串行化
NonSerialized

Field

应用于被标示为可串行化的类的字段,指出这些字段将不可被串行化
StructLayout

Class、struct

指定类或结构的数据布局的性质,比如Auto、Explicit或sequential
ThreadStatic

Field(静态)

实现线程局部存储(TLS)。不能跨多个线程共享给定的静态字段,每个线程拥有这个静态字段的副本
而Property是指编程过程中的字段,也即类的成员。
如:
private int hour; //定义私有变量表示“小时“,外部是访问不到的.}
public int Hour// 定义Hour程序接口
{
set { hour=value; }
get { return hour;}
-get

如何获取类或属性的自定义特性


1. 定义一个以Attribute结尾的特性类, 特性类继承自System.Attribute, 如下所示.
[AttributeUsage(AttributeTargets.Property, AllowMultiple=false)]
public class PrimaryKeyAttribute : System.Attribute
{
.............
其中AttributeTargets是一个枚举的值, 可以是: Assembly | Module | Class | Struct | Enum | Constructor | Method | Property | Field | Event | Interface | Parameter | Delegate

2. 在需要使用的地方使用PrimaryKey自定义特性标签, 如下所示.
[PrimaryKey(Column = “CustomerID“, IsIdentity=false)]
public int ID
{
.............

3. 为了获取自定义特性的信息, 需要反射的方式获取其数据, 首先我们定义一个类来存储这些信息, 如下所示
public class PrimaryKeyModel
{
private readonly PropertyInfo propertyInfo;//外键的属性字段信息
private readonly PrimaryKeyAttribute primaryKeyAtt;//外键的特性信息
................

public static PrimaryKeyModel GetPrimaryKey(Type type)
{
PropertyInfo properties = type.GetProperties();
foreach (PropertyInfo p in properties)
{
object keys = p.GetCustomAttributes(typeof(PrimaryKeyAttribute), true);
if (keys.Length == 1)
{
return new PrimaryKeyModel(p, keys as PrimaryKeyAttribute);
}
}
return null;
}

4. 在Customer类中获取其特性的信息代码如下
string strReturn = string.Empty;
//Get PrimaryKey Name
PrimaryKeyModel attribute= PrimaryKeyModel.GetPrimaryKey(this.GetType());
if(attribute != null)
{
strReturn += string.Format(“PrimaryKey Name:{0} IsIdentity:{1} Column:{2}\r\n“,
attribute.Property.Name, attribute.PrimaryKeyAtt.IsIdentity, attribute.PrimaryKeyAtt.Column);
}
-attributeusage

C# attribute 如何获取当前对象实例 在线等


无法。比如你定义一个类,一个特性,然后把特性加到类上面。元数据是编译在类里面,而不是在属性里面。所以特性里面不包含类的信息。一般都是从类里面遍历特性。

[AttributeUsage(AttributeTargets.Class)] 这是什么用法


其是这个是创建自定义特性的用法。
通过定义一个特性类,可以创建您自己的自定义特性。该特性类直接或间接地从 Attribute 派生,有助于方便快捷地在元数据中标识特性定义。 假设您要用编写类型的程序员的名字标记类型。 你的例子是一个自定义 VersionAttribute 特性类:
类名是特性的名称,即 VersionAttribute 。 它由 Attribute 派生而来,因此是自定义特性类。 构造函数的参数是自定义特性的定位参数。 任何公共的读写字段或属性都是命名参数。 你的代码里面Name,Date,Description都是的命名参数。 请注意 AttributeUsage 特性的用法,它使得 VersionAttribute 特性仅在类和 struct声明中有效。
-get

C#中类似 [AttributeUsage(AttributeTargets.Field)]这种在两边加 [ 类名] 的用法是什么用法啊


C# 中 这个叫做特性,可以通过反射拿到
详情请见MSDN
http://msdn.microsoft.com/zh-cn/library/z0w1kczw.aspx

c#特性的应用


举个简单的例子:
先定义个特性
从Attribute继承,并标明用法
[AttributeUsage(AttributeTargets.Property|AttributeTargets.Class)]
public class MyAttribute:Attribute
{

}
//应用此特性
[My]
public class Entity
{
private int m_MyProperty ;
[My]
public virtual int MyProperty
{
get { return m_MyProperty; }
set { m_MyProperty = value; }
}
}
//检索此特性(在类上标的特性)
class program
{
static void Main()
{
Attribute attr = Attribute.GetCustomAttribute(typeof(Entity), typeof(MyAttribute),false);
}
}
-attributeusage

c# Attribute 怎么用


假设你的F()方法是定义在下面这个类里面:
public class MyClass
{
[IStudent(Name = “abc“, Age = 20)]
public void F()
{
}
}
那么可以这么去取值:
Type type = typeof(MyClass);
MethodInfo methodInfo = type.GetMethod(“F“);
if (methodInfo.IsDefined(typeof(IStudentAttribute), false))
{
object attributes = methodInfo.GetCustomAttributes(typeof(IStudentAttribute), false);
IStudentAttribute studentAttr = (IStudentAttribute)attributes;
Console.WriteLine(studentAttr.Name + studentAttr.Age);
}
实际上,Attribute可以有很多用处,比如说,你可以在某个方法上做标记看有没有权限调用,或者在某个属性上标记,看要如何校验。例如(实在习惯用var关键字了,下面的代码都用var了,还有Linq):
假设我们有这么一个标记来说明操作的权限:

/// 《summary》
/// 声明权限的标记
/// 《/summary》
[AttributeUsage(AttributeTargets.Method)]
public class PermissonAttribute : Attribute
{
public string Role { get; set; }
public PermissonAttribute(string role)
{
this.Role = role;
}
public PermissonAttribute()
{
}
}
有一个操作类应用了该标记:
/// 《summary》
/// 文件操作类
/// 《/summary》
public class FileOperations
{
/// 《summary》
/// 任何人都可以调用Read
/// 《/summary》
[Permisson(“Anyone“)]
public void Read()
{
}
/// 《summary》
/// 只有文件所有者才能Write
/// 《/summary》
[Permisson(“Owner“)]
public void Write()
{
}
}
然后我们写一个工具类来检查操作权限
/// 《summary》
/// 调用操作的工具类
/// 《/summary》
public static class OperationInvoker
{
public static void Invoke(object target, string role, string operationName, object parameters)
{
var targetType = target.GetType();
var methodInfo = targetType.GetMethod(operationName);
if (methodInfo.IsDefined(typeof(PermissonAttribute), false))
{
// 读取出所有权限相关的标记
var permissons = methodInfo
.GetCustomAttributes(typeof(PermissonAttribute), false)
.OfType《PermissonAttribute》();
// 如果其中有满足的权限
if (permissons.Any(p =》 p.Role == role))
{
methodInfo.Invoke(target, parameters);
}
else
{
throw new Exception(string.Format(“角色{0}没有访问操作{1}的权限!“, role, operationName));
}
}
}
}
最后,在使用的时候:
var role = “Anyone“;
var opertion = new FileOperations();
// 可以正常调用Read
OperationInvoker.Invoke(operation, “Read“, null);
// 但是不能调用Write
OperationInvoker.Invoke(operation, “Write“, null);
-get