zoukankan      html  css  js  c++  java
  • Emit:动态给一个类型添加Attribute

    下面这段代码整理自sl4的官方文档,已经加了详细的注释,相信大家都能看明白:

    using System;
    using System.Reflection;
    using System.Reflection.Emit;
    using System.Threading;
    
    namespace CustomAttributeBuilderSample
    {
    
        public class DemoClass
        {
            static void Main(string[] args)
            {
    
                //得到新类型
                Type myType = BuildTypeWithCustomAttributesOnMethod();
    
                //创建myType的实例
                object myInstance = Activator.CreateInstance(myType);
    
                //获取myType上应用的所有Attribute
                object[] customAttrs = myType.GetCustomAttributes(true);
    
                Console.WriteLine("Custom Attributes for Type 'MyType':" + "\n");
                object attrVal = null;
    
                foreach (object customAttr in customAttrs)
                {
                    //获取ClassCreatorAttribute中的Creator属性值
                    attrVal = typeof(ClassCreatorAttribute).InvokeMember("Creator", BindingFlags.GetProperty, null, customAttr, new object[] { });
                    Console.WriteLine(String.Format("-- Attribute: [{0} = \"{1}\"]", customAttr, attrVal) + "\n");
                }
    
                Console.WriteLine("Custom Attributes for Method 'HelloWorld()' in 'MyType':" + "\n");
                //获取myType中的HelloWorld方法上的所有Attribute
                customAttrs = myType.GetMember("HelloWorld")[0].GetCustomAttributes(true);
    
                foreach (object customAttr in customAttrs)
                {
                    //获取DateLastUpdatedAttribute的DateUpdated属性值
                    attrVal = typeof(DateLastUpdatedAttribute).InvokeMember("DateUpdated", BindingFlags.GetProperty, null, customAttr, new object[] { });
                    Console.WriteLine(String.Format("-- Attribute: [{0} = \"{1}\"]", customAttr, attrVal) + "\n");
                }
    
                Console.WriteLine("---" + "\n");
                //动态调用myType实例中的HelloWorld方法
                Console.WriteLine(myType.InvokeMember("HelloWorld", BindingFlags.InvokeMethod, null, myInstance, new object[] { }) + "\n");
    
    
                Console.ReadKey();
            }
    
            /// <summary>
            /// 创建一个应用了ClassCreatorAttribute、DateLastUpdatedAttribute的类型
            /// </summary>
            /// <returns></returns>
            public static Type BuildTypeWithCustomAttributesOnMethod()
            {
    
                AppDomain currentDomain = Thread.GetDomain();
    
                AssemblyName myAsmName = new AssemblyName();
                myAsmName.Name = "MyAssembly";
    
                //动态创建一个程序集
                AssemblyBuilder myAsmBuilder = currentDomain.DefineDynamicAssembly(myAsmName, AssemblyBuilderAccess.Run);
    
                //动态创建一个模块
                ModuleBuilder myModBuilder = myAsmBuilder.DefineDynamicModule("MyModule");
    
                //动态创建一个类型:MyType
                TypeBuilder myTypeBuilder = myModBuilder.DefineType("MyType", TypeAttributes.Public);
    
                //定义构造器参数
                Type[] ctorParams = new Type[] { typeof(string) };
    
                //获取构造器信息
                ConstructorInfo classCtorInfo = typeof(ClassCreatorAttribute).GetConstructor(ctorParams);
    
                //动态创建ClassCreatorAttribute
                CustomAttributeBuilder myCABuilder = new CustomAttributeBuilder(
                               classCtorInfo,
                               new object[] { "Joe Programmer" });
    
                //将上面动态创建的Attribute附加到(动态创建的)类型MyType
                myTypeBuilder.SetCustomAttribute(myCABuilder);
    
                //动态创建一个无返回值,无参数的,公有方法HelloWorld
                MethodBuilder myMethodBuilder = myTypeBuilder.DefineMethod("HelloWorld", MethodAttributes.Public, null, new Type[] { });
    
                ctorParams = new Type[] { typeof(string) };
    
                //获取DateLastUpdatedAttribute的构造函数信息
                classCtorInfo = typeof(DateLastUpdatedAttribute).GetConstructor(ctorParams);
    
                //动态创建DateLastUpdatedAttribute
                CustomAttributeBuilder myCABuilder2 = new CustomAttributeBuilder(
                               classCtorInfo,
                               new object[] { DateTime.Now.ToString() });
    
                //将上面动态创建的Attribute附加到(动态创建的)方法HelloWorld
                myMethodBuilder.SetCustomAttribute(myCABuilder2);
    
                ILGenerator myIL = myMethodBuilder.GetILGenerator();
                myIL.EmitWriteLine("Hello, world!");//在HelloWorld方法中,创建一行等效于Console.Write("Hello,world!");的代码
                myIL.Emit(OpCodes.Ret);//HelloWorld方法的return语句
    
                return myTypeBuilder.CreateType();
    
            }
    
    
        }
    
    
    
        /// <summary>
        /// 创建一个自定义的Attribute,稍后将它应用在动态创建的“类型”上
        /// </summary>
        public class ClassCreatorAttribute : Attribute
        {
            private string creator;
            public string Creator
            {
                get
                {
                    return creator;
                }
            }
    
            public ClassCreatorAttribute(string name)
            {
                this.creator = name;
            }
    
        }
    
        /// <summary>
        /// 创建一个自定义的Attribute,稍后将它应用在动态创建的“方法”上
        /// </summary>
        public class DateLastUpdatedAttribute : Attribute
        {
            private string dateUpdated;
            public string DateUpdated
            {
                get
                {
                    return dateUpdated;
                }
            }
    
            public DateLastUpdatedAttribute(string theDate)
            {
                this.dateUpdated = theDate;
            }
    
        }
    
    
    }
    

      

     运行输出结果:

    Custom Attributes for Type 'MyType':

    -- Attribute: [CustomAttributeBuilderSample.ClassCreatorAttribute = "Joe Program mer"]

    Custom Attributes for Method 'HelloWorld()' in 'MyType':

    -- Attribute: [CustomAttributeBuilderSample.DateLastUpdatedAttribute = "2011/11/ 13 21:46:31"]

    ---

    Hello, world!

  • 相关阅读:
    MIne FirstBlog
    P6563 [SBCOI2020]一直在你身旁
    P6563 [SBCOI2020]一直在你身旁
    T122085 [SBCOI2020]时光的流逝
    LC 918. Maximum Sum Circular Subarray
    1026 Table Tennis
    LC 1442. Count Triplets That Can Form Two Arrays of Equal XOR
    LC 1316. Distinct Echo Substrings
    LC 493. Reverse Pairs
    1029 Median (二分)
  • 原文地址:https://www.cnblogs.com/yjmyzz/p/2247600.html
Copyright © 2011-2022 走看看