宜宾营销型网站建设,怎么做seo信息优化,菜鸟app制作教程,门户网站那个程序比较属性提供了一种将元数据或声明性信息与代码(程序集、类型、方法、属性等)关联的强大方法。将属性与程序实体关联后#xff0c;可以使用称为反射的技术在运行时查询该属性。
属性具有以下属性#xff1a;
属性将元数据添加到您的程序中。元数据是有关程序中定义的类型的信息…属性提供了一种将元数据或声明性信息与代码(程序集、类型、方法、属性等)关联的强大方法。将属性与程序实体关联后可以使用称为反射的技术在运行时查询该属性。
属性具有以下属性
属性将元数据添加到您的程序中。元数据是有关程序中定义的类型的信息。所有 .NET 程序集都包含一组指定的元数据用于描述程序集中定义的类型和类型成员。您可以添加自定义属性来指定所需的任何其他信息。您可以将一个或多个属性应用于整个程序集、模块或较小的程序元素(例如类和属性)。属性可以像方法和属性一样接受参数。您的程序可以使用反射检查自己的元数据或其他程序中的元数据。
反射提供描述程序集、模块和类型的对象(类型为 Type)。您可以使用反射动态创建类型的实例将类型绑定到现有对象或者从现有对象获取类型并调用其方法或访问其字段和属性。如果您在代码中使用属性则反射可让您访问它们。
这是一个使用 GetType() 方法(所有类型都从 Object 基类继承)获取变量类型的反射简单示例
请确保在 .cs 文件顶部添加 using System; 和 using System.Reflection;。
// Using GetType to obtain type information:
int i 42;
Type type i.GetType();
Console.WriteLine(type);
输出为System.Int32。
以下示例使用反射获取已加载程序集的全名。
// Using Reflection to get information of an Assembly:
Assembly info typeof(int).Assembly;
Console.WriteLine(info);
输出类似于System.Private.CoreLibVersion7.0.0.0CultureneutralPublicKeyToken7cec85d7bea7798e。
C# 关键字 protected 和 internal 在中间语言 (IL) 中没有任何意义并且未在反射 API 中使用。IL 中的相应术语是 Family 和 Assembly。要使用反射识别内部方法请使用 IsAssembly 属性。要识别受保护的内部方法请使用 IsFamilyOrAssembly。
使用属性
属性可以放置在几乎任何声明上但特定属性可能会限制其有效的声明类型。在 C# 中您可以通过将属性名称放在方括号 ([]) 中将其放在适用实体的声明上方来指定属性。
在此示例中SerializableAttribute 属性用于将特定特征应用于类
[Serializable]
public class SampleClass
{// Objects of this type can be serialized.
}
具有属性 DllImportAttribute 的方法的声明如下例所示
[System.Runtime.InteropServices.DllImport(user32.dll)]
extern static void SampleMethod();
可以在一个声明中放置多个属性如下例所示
void MethodA([In][Out] ref double x) { }
void MethodB([Out][In] ref double x) { }
void MethodC([In, Out] ref double x) { }
对于给定实体某些属性可以指定多次。这种多用途属性的一个示例是 ConditionalAttribute
[Conditional(DEBUG), Conditional(TEST1)]
void TraceMethod()
{// ...
}
按照惯例所有属性名称都以单词“Attribute”结尾以将其与 .NET 库中的其他项目区分开来。但是在代码中使用属性时您无需指定属性后缀。例如[DllImport] 相当于 [DllImportAttribute]但 DllImportAttribute 是 .NET 类库中属性的实际名称。
属性参数
许多属性都有参数这些参数可以是位置参数、未命名参数或命名参数。任何位置参数都必须按特定顺序指定并且不能省略。命名参数是可选的可以按任何顺序指定。位置参数首先指定。例如这三个属性是等效的
[DllImport(user32.dll)]
[DllImport(user32.dll, SetLastErrorfalse, ExactSpellingfalse)]
[DllImport(user32.dll, ExactSpellingfalse, SetLastErrorfalse)]
第一个参数DLL 名称是位置参数始终位于最前面其他参数是命名参数。在这种情况下两个命名参数默认为 false因此可以省略。位置参数对应于属性构造函数的参数。命名或可选参数对应于属性的属性或字段。
属性目标
属性的目标是属性所应用的实体。例如属性可能应用于类、特定方法或整个程序集。默认情况下属性应用于其后的元素。但您也可以明确标识例如属性是应用于方法、其参数还是其返回值。
要明确标识属性目标请使用以下语法
[target : attribute-list]
可能的目标值列表如下表所示。 您可以指定字段目标值以将属性应用于为自动实现的属性创建的支持字段。
以下示例显示如何将属性应用于程序集和模块。
using System;
using System.Reflection;
[assembly: AssemblyTitleAttribute(Production assembly 4)]
[module: CLSCompliant(true)]
以下示例显示如何在 C# 中将特性应用于方法、方法参数和方法返回值。
// default: applies to method
[ValidatedContract]
int Method1() { return 0; }// applies to method
[method: ValidatedContract]
int Method2() { return 0; }// applies to parameter
int Method3([ValidatedContract] string contract) { return 0; }// applies to return value
[return: ValidatedContract]
int Method4() { return 0; }