时间:2021-05-20
前言
本文主要给大家介绍了关于C#基础之Attribute和反射的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧。
Attribute(特性)
Attribute是C#的一种语言特性,用于为各种实体(class,field,property)附加一些说明性信息, 并且可以在运行时环境中检索这些信息(通过反射)。
所有的Attribute必须继承自Attribute类,按照约定,特性类的名称带有 Attribute 后缀。使用特性时可以包含或省略此后缀。
AttributeUsage
AttributeUsage是Attribute的Attribute,用于给自定义的Attribute加一些限定。
AttributeTargets指定你这个attribute限制用于哪类实体上,在这里,实体是指: class、method、constructor、field、property、GenericParameter或者用All,表明可用于所有实体。每个target标记可以用|链接,如AttributeTargets.Class|AttributeTargets.Method表示这个attribute可用于class或者method。
下面例子表明了每种target的用法:
using System; namespace AttTargsCS { // This attribute is only valid on a class. [AttributeUsage(AttributeTargets.Class)] public class ClassTargetAttribute : Attribute { } // This attribute is only valid on a method. [AttributeUsage(AttributeTargets.Method)] public class MethodTargetAttribute : Attribute { } // This attribute is only valid on a constructor. [AttributeUsage(AttributeTargets.Constructor)] public class ConstructorTargetAttribute : Attribute { } // This attribute is only valid on a field. [AttributeUsage(AttributeTargets.Field)] public class FieldTargetAttribute : Attribute { } // This attribute is valid on a class or a method. [AttributeUsage(AttributeTargets.Class|AttributeTargets.Method)] public class ClassMethodTargetAttribute : Attribute { } // This attribute is valid on a generic type parameter. [AttributeUsage(AttributeTargets.GenericParameter)] public class GenericParameterTargetAttribute : Attribute { } // This attribute is valid on any target. [AttributeUsage(AttributeTargets.All)] public class AllTargetsAttribute : Attribute { } [ClassTarget] [ClassMethodTarget] [AllTargets] public class TestClassAttribute { [ConstructorTarget] [AllTargets] TestClassAttribute() { } [MethodTarget] [ClassMethodTarget] [AllTargets] public void Method1() { } [FieldTarget] [AllTargets] public int myInt; public void GenericMethod< [GenericParameterTarget, AllTargets] T>(T x) { } static void Main(string[] args) { } }}AllowMultiple
AllowMultiple表明了这个attribute可否多次应用于同一个实体,默认为false
[AttributeUsage(AttributeTargets.Class, AllowMultiple = true)] class MultiUseAttr : Attribute { } [MultiUseAttr, MultiUseAttr] class Class2 { }Inherited
Inherited表明这个attribute是否可以被继承传递,即子类或子类从父类继承的成员是否带这个attribute,默认为true
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method | AttributeTargets.Property | AttributeTargets.Field, Inherited = true)]public class InheritedAttribute : Attribute{} [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method | AttributeTargets.Property | AttributeTargets.Field, Inherited = false)]public class NotInheritedAttribute : Attribute{} using System;using System.Reflection; [InheritedAttribute]public class BaseA{ [InheritedAttribute] public virtual void MethodA() {}} public class DerivedA : BaseA{ public override void MethodA() {}} [NotInheritedAttribute] public class BaseB{ [NotInheritedAttribute] public virtual void MethodB() {}} public class DerivedB : BaseB{ public override void MethodB() {}} public class Example{ public static void Main() { Type typeA = typeof(DerivedA); Console.WriteLine("DerivedA has Inherited attribute: {0}", typeA.GetCustomAttributes(typeof(InheritedAttribute), true).Length > 0); MethodInfo memberA = typeA.GetMethod("MethodA"); Console.WriteLine("DerivedA.MemberA has Inherited attribute: {0}\n", memberA.GetCustomAttributes(typeof(InheritedAttribute), true).Length > 0); Type typeB = typeof(DerivedB); Console.WriteLine("DerivedB has Inherited attribute: {0}", typeB.GetCustomAttributes(typeof(InheritedAttribute), true).Length > 0); MethodInfo memberB = typeB.GetMethod("MethodB"); Console.WriteLine("DerivedB.MemberB has Inherited attribute: {0}", memberB.GetCustomAttributes(typeof(InheritedAttribute), true).Length > 0); }}// The example displays the following output:// DerivedA has Inherited attribute: True// DerivedA.MemberA has Inherited attribute: True// // DerivedB has Inherited attribute: False// DerivedB.MemberB has Inherited attribute: False反射
Reflection,中文翻译为反射,是审查元数据并收集关于它的类型信息的能力。元数据(编译以后的最基本数据单元)就是一大堆的表,当编译程序集或者模块时,编译器会创建一个类定义表,一个字段定义表,和一个方法定义表等。
反射是.Net中获取运行时类型信息的方式,.Net的应用程序由几个部分:‘程序集(Assembly)'、‘模块(Module)'、‘类型(class)'组成,而反射提供一种编程的方式,让程序员可以在程序运行期获得这几个组成部分的相关信息, Assemblies contain modules. Modules contain classes. Classes contain functions.
System.reflection命名空间包含的几个类,允许你反射(解析)这些元数据表的代码
System.Reflection.AssemblySystem.Reflection.MemberInfoSystem.Reflection.EventInfoSystem.Reflection.FieldInfoSystem.Reflection.MethodBaseSystem.Reflection.ConstructorInfoSystem.Reflection.MethodInfoSystem.Reflection.PropertyInfoSystem.Type以下是上面几个类的使用方法:
反射的作用:
使用反射获取类型
public void Process(object processObj){Type t = processsObj.GetType();if(t.GetInterface(“ITest”) !=null) …}创建一个对象
public class TestClass { private string _value; public TestClass() { } public TestClass(string value) { _value = value; } public string GetValue( string prefix ) { if( _value==null ) return "NULL"; else return prefix+" : "+_value; } //获取类型信息Type t = Type.GetType("TestSpace.TestClass");//构造器的参数object[] constuctParms = new object[]{"timmy"};//根据类型创建对象object dObj = Activator.CreateInstance(t,constuctParms);//获取方法的信息MethodInfo method = t.GetMethod("GetValue");//调用方法的一些标志位,这里的含义是Public并且是实例方法,这也是默认的值BindingFlags flag = BindingFlags.Public | BindingFlags.Instance;//GetValue方法的参数object[] parameters = new object[]{"Hello"};//调用方法,用一个object接收返回值object returnValue = method.Invoke(dObj,flag,Type.DefaultBinder,parameters,null);总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对的支持。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
扩展阅读c#基础系列1---深入理解值类型和引用类型c#基础系列2---深入理解String引言在上篇文章深入理解值类型和引用类型的时候,有的小伙伴就推荐说一说
bootstraptable系列:JS表格组件神器bootstraptable详解(基础版)JS组件系列之Bootstraptable表格组件神器【终结篇】JS
IOS开发之Object-C中的对象详解前言关于C语言的基础部分已经记录完毕,接下来就是学习Object-C了,编写oc程序需要使用Foundation框架。下
本文实例讲述了C#根据反射和特性实现ORM映射的方法。分享给大家供大家参考。具体如下:(一)关于反射什么是反射?反射就是在运行时,动态获取对象信息的方法。比如:
C++primer基础之容器insert今天学习C++基础知识的时候遇到这样问题,始终出现segmentsfault。最后才发现原来是自己对“容器insert之