FieldBuilder.SetCustomAttribute Метод

Определение

Задает пользовательский атрибут.

Перегрузки

SetCustomAttribute(CustomAttributeBuilder)

Задает настраиваемый атрибут с помощью построителя настраиваемых атрибутов.

SetCustomAttribute(ConstructorInfo, Byte[])

Задает настраиваемый атрибут с помощью большого двоичного объекта пользовательских атрибутов.

SetCustomAttribute(CustomAttributeBuilder)

Исходный код:
FieldBuilder.cs
Исходный код:
FieldBuilder.cs
Исходный код:
FieldBuilder.cs

Задает настраиваемый атрибут с помощью построителя настраиваемых атрибутов.

public:
 void SetCustomAttribute(System::Reflection::Emit::CustomAttributeBuilder ^ customBuilder);
public void SetCustomAttribute (System.Reflection.Emit.CustomAttributeBuilder customBuilder);
member this.SetCustomAttribute : System.Reflection.Emit.CustomAttributeBuilder -> unit
Public Sub SetCustomAttribute (customBuilder As CustomAttributeBuilder)

Параметры

customBuilder
CustomAttributeBuilder

Экземпляр вспомогательного класса для определения настраиваемого атрибута.

Исключения

con имеет значение null.

Родительский тип данного поля закрыт.

Примеры

В следующем примере кода показано использование SetCustomAttribute в контексте FieldBuilderс использованием CustomAttributeBuilder.

using namespace System;
using namespace System::Threading;
using namespace System::Reflection;
using namespace System::Reflection::Emit;

[AttributeUsage(AttributeTargets::All,AllowMultiple=false)]
public ref class MyAttribute1: public Attribute
{
public:
   String^ myCustomAttributeValue;
   MyAttribute1( String^ myString )
   {
      myCustomAttributeValue = myString;
   }
};


[AttributeUsage(AttributeTargets::All,AllowMultiple=false)]
public ref class MyAttribute2: public Attribute
{
public:
   bool myCustomAttributeValue;
   MyAttribute2( bool myBool )
   {
      myCustomAttributeValue = myBool;
   }
};

Type^ CreateCallee( AppDomain^ currentDomain )
{
   // Create a simple name for the assembly.
   AssemblyName^ myAssemblyName = gcnew AssemblyName;
   myAssemblyName->Name = "EmittedAssembly";

   // Create the called dynamic assembly.
   AssemblyBuilder^ myAssemblyBuilder = currentDomain->DefineDynamicAssembly( myAssemblyName, AssemblyBuilderAccess::RunAndSave );
   ModuleBuilder^ myModuleBuilder = myAssemblyBuilder->DefineDynamicModule( "EmittedModule", "EmittedModule.mod" );

   // Define a public class named 'CustomClass' in the assembly.
   TypeBuilder^ myTypeBuilder = myModuleBuilder->DefineType( "CustomClass", TypeAttributes::Public );

   // Define a private String field named 'MyField' in the type.
   FieldBuilder^ myFieldBuilder = myTypeBuilder->DefineField( "MyField", String::typeid, FieldAttributes::Public );
   Type^ myAttributeType1 = MyAttribute1::typeid;

   // Create a Constructorinfo Object* for attribute 'MyAttribute1'.
   array<Type^>^type1 = {String::typeid};
   ConstructorInfo^ myConstructorInfo = myAttributeType1->GetConstructor( type1 );

   // Create the CustomAttribute instance of attribute of type 'MyAttribute1'.
   array<Object^>^obj1 = {"Test"};
   CustomAttributeBuilder^ attributeBuilder = gcnew CustomAttributeBuilder( myConstructorInfo,obj1 );

   // Set the CustomAttribute 'MyAttribute1' to the Field.
   myFieldBuilder->SetCustomAttribute( attributeBuilder );
   Type^ myAttributeType2 = MyAttribute2::typeid;

   // Create a Constructorinfo Object* for attribute 'MyAttribute2'.
   array<Type^>^type2 = {bool::typeid};
   ConstructorInfo^ myConstructorInfo2 = myAttributeType2->GetConstructor( type2 );

   // Set the CustomAttribute 'MyAttribute2' to the Field.
   array<Byte>^bytes = {01,00,01,00,00};
   myFieldBuilder->SetCustomAttribute( myConstructorInfo2, bytes );

   // Create a method.
   array<Type^>^type3 = {String::typeid,int::typeid};
   MethodBuilder^ myMethodBuilder = myTypeBuilder->DefineMethod( "MyMethod", MethodAttributes::Public, nullptr, type3 );
   ILGenerator^ myILGenerator = myMethodBuilder->GetILGenerator();
   myILGenerator->Emit( OpCodes::Ldarg_0 );
   myILGenerator->Emit( OpCodes::Ldarg_1 );
   myILGenerator->Emit( OpCodes::Stfld, myFieldBuilder );
   myILGenerator->EmitWriteLine( "Value of the Field is :" );
   myILGenerator->EmitWriteLine( myFieldBuilder );
   myILGenerator->Emit( OpCodes::Ret );
   return myTypeBuilder->CreateType();
}

int main()
{
   try
   {
      Type^ myCustomClass = CreateCallee( Thread::GetDomain() );

      // Construct an instance of a type.
      Object^ myObject = Activator::CreateInstance( myCustomClass );
      Console::WriteLine( "FieldBuilder Sample" );

      // Find a method in this type and call it on this Object*.
      MethodInfo^ myMethodInfo = myCustomClass->GetMethod( "MyMethod" );
      array<Object^>^obj1 = {"Sample string",3};
      myMethodInfo->Invoke( myObject, obj1 );

      // Retrieve the values of Attributes applied to field and display to console.
      array<FieldInfo^>^myFieldInfo = myCustomClass->GetFields();
      for ( int i = 0; i < myFieldInfo->Length; i++ )
      {
         array<Object^>^attributes = myFieldInfo[ i ]->GetCustomAttributes( true );
         for ( int index = 0; index < attributes->Length; index++ )
         {
            if ( dynamic_cast<MyAttribute1^>(attributes[ index ]) )
            {
               MyAttribute1^ myCustomAttribute = safe_cast<MyAttribute1^>(attributes[ index ]);
               Console::WriteLine( "Attribute Value of (MyAttribute1): {0}", myCustomAttribute->myCustomAttributeValue );
            }
            if ( dynamic_cast<MyAttribute2^>(attributes[ index ]) )
            {
               MyAttribute2^ myCustomAttribute = safe_cast<MyAttribute2^>(attributes[ index ]);
               Console::WriteLine( "Attribute Value of (MyAttribute2): {0}", myCustomAttribute->myCustomAttributeValue );
            }
         }
      }
   }
   catch ( Exception^ e ) 
   {
      Console::WriteLine( "Exception Caught {0}", e->Message );
   }
}

using System;
using System.Threading;
using System.Reflection;
using System.Reflection.Emit;

namespace MySample
{
   [AttributeUsage(AttributeTargets.All, AllowMultiple = false)]
   public class MyAttribute1 :Attribute
   {
      public string myCustomAttributeValue;
      public MyAttribute1(string myString)
      {
         myCustomAttributeValue = myString;
      }
   }
   [AttributeUsage(AttributeTargets.All, AllowMultiple = false)]
   public class MyAttribute2 :Attribute
   {
      public bool myCustomAttributeValue;
      public MyAttribute2(bool myBool)
      {
         myCustomAttributeValue = myBool;
      }
   }

   class FieldBuilder_Sample
   {
      private static Type CreateCallee(AppDomain currentDomain)
      {

         // Create a simple name for the assembly.
         AssemblyName myAssemblyName = new AssemblyName();
         myAssemblyName.Name = "EmittedAssembly";
         // Create the called dynamic assembly.
         AssemblyBuilder myAssemblyBuilder =
            currentDomain.DefineDynamicAssembly(myAssemblyName, AssemblyBuilderAccess.RunAndSave);
         ModuleBuilder myModuleBuilder =
                  myAssemblyBuilder.DefineDynamicModule("EmittedModule","EmittedModule.mod");
         // Define a public class named 'CustomClass' in the assembly.
         TypeBuilder myTypeBuilder = myModuleBuilder.DefineType("CustomClass",
            TypeAttributes.Public);
         // Define a private String field named 'MyField' in the type.
         FieldBuilder myFieldBuilder =
            myTypeBuilder.DefineField("MyField", typeof(String), FieldAttributes.Public);
         Type myAttributeType1 = typeof(MyAttribute1);
         // Create a Constructorinfo object for attribute 'MyAttribute1'.
         ConstructorInfo myConstructorInfo = myAttributeType1.GetConstructor(
            new Type[1]{typeof(string)});
         // Create the CustomAttribute instance of attribute of type 'MyAttribute1'.
         CustomAttributeBuilder attributeBuilder =
                     new CustomAttributeBuilder( myConstructorInfo,new object[1]{"Test"});
         // Set the CustomAttribute 'MyAttribute1' to the Field.
         myFieldBuilder.SetCustomAttribute(attributeBuilder);

          Type myAttributeType2 = typeof(MyAttribute2);
         // Create a Constructorinfo object for attribute 'MyAttribute2'.
        ConstructorInfo myConstructorInfo2 = myAttributeType2.GetConstructor(
            new Type[1]{typeof(bool)});
         // Set the CustomAttribute 'MyAttribute2' to the Field.
         myFieldBuilder.SetCustomAttribute(myConstructorInfo2,new byte[]{01,00,01,00,00});

         // Create a method.
         MethodBuilder myMethodBuilder= myTypeBuilder.DefineMethod("MyMethod",
            MethodAttributes.Public,null,new Type[2]{typeof(string),typeof(int)});

         ILGenerator myILGenerator = myMethodBuilder.GetILGenerator();
         myILGenerator.Emit(OpCodes.Ldarg_0);
         myILGenerator.Emit(OpCodes.Ldarg_1);
         myILGenerator.Emit(OpCodes.Stfld, myFieldBuilder);
         myILGenerator.EmitWriteLine("Value of the Field is :");
         myILGenerator.EmitWriteLine(myFieldBuilder);
         myILGenerator.Emit(OpCodes.Ret);

         return myTypeBuilder.CreateType();
      }
      public static void Main()
      {
         try
         {
            Type myCustomClass = CreateCallee(Thread.GetDomain());
            // Construct an instance of a type.
            Object myObject = Activator.CreateInstance(myCustomClass);
            Console.WriteLine( "FieldBuilder Sample");
            // Find a method in this type and call it on this object.
            MethodInfo myMethodInfo = myCustomClass.GetMethod("MyMethod");
            myMethodInfo.Invoke(myObject, new object[2]{"Sample string",3});
            // Retrieve the values of Attributes applied to field and display to console.
            FieldInfo[] myFieldInfo = myCustomClass.GetFields();
            for(int i =0;i<myFieldInfo.Length;i++)
            {
               object[] attributes = myFieldInfo[i].GetCustomAttributes(true);
               for(int index=0; index < attributes.Length; index++)
               {
                  if(attributes[index] is MyAttribute1)
                  {
                     MyAttribute1 myCustomAttribute = (MyAttribute1)attributes[index];
                     Console.WriteLine("Attribute Value of (MyAttribute1): "
                                       + myCustomAttribute.myCustomAttributeValue);
                  }
                  if(attributes[index] is MyAttribute2)
                  {
                     MyAttribute2 myCustomAttribute = (MyAttribute2)attributes[index];
                     Console.WriteLine("Attribute Value of (MyAttribute2): "
                                       + myCustomAttribute.myCustomAttributeValue);
                  }
               }
            }
         }
         catch (Exception e)
         {
            Console.WriteLine("Exception Caught "+e.Message);
         }
      }
   }
}
Imports System.Threading
Imports System.Reflection
Imports System.Reflection.Emit

Namespace MySample
   <AttributeUsage(AttributeTargets.All, AllowMultiple:=False)> Public Class MyAttribute1
      Inherits Attribute
      Public myCustomAttributeValue As String

      Public Sub New(ByVal myString As String)
         myCustomAttributeValue = myString
      End Sub
   End Class
   <AttributeUsage(AttributeTargets.All, AllowMultiple:=False)> Public Class MyAttribute2
      Inherits Attribute
      Public myCustomAttributeValue As Boolean

      Public Sub New(ByVal myBool As Boolean)
         myCustomAttributeValue = myBool
      End Sub
   End Class

   Class FieldBuilder_Sample

      Private Shared Function CreateCallee(ByVal currentDomain As AppDomain) As Type
         ' Create a simple name for the assembly.
         Dim myAssemblyName As New AssemblyName()
         myAssemblyName.Name = "EmittedAssembly"
         ' Create the called dynamic assembly.
         Dim myAssemblyBuilder As AssemblyBuilder = _
                     currentDomain.DefineDynamicAssembly(myAssemblyName, _
                     AssemblyBuilderAccess.RunAndSave)
         Dim myModuleBuilder As ModuleBuilder = _
               myAssemblyBuilder.DefineDynamicModule("EmittedModule", _
                                                   "EmittedModule.mod")
         ' Define a public class named 'CustomClass' in the assembly.
         Dim myTypeBuilder As TypeBuilder = myModuleBuilder.DefineType("CustomClass", _
                                                TypeAttributes.Public)
         ' Define a private String field named 'MyField' in the type.
         Dim myFieldBuilder As FieldBuilder = myTypeBuilder.DefineField("MyField", _
                                       GetType(String), FieldAttributes.Public)
         Dim myAttributeType1 As Type = GetType(MyAttribute1)
         ' Create a Constructorinfo object for attribute 'MyAttribute1'.
         Dim myConstructorInfo As ConstructorInfo = _
                     myAttributeType1.GetConstructor(New Type(0) {GetType(String)})
         ' Create the CustomAttribute instance of attribute of type 'MyAttribute1'.
         Dim attributeBuilder As _
         New CustomAttributeBuilder(myConstructorInfo, New Object(0) {"Test"})
         ' Set the CustomAttribute 'MyAttribute1' to the Field.
         myFieldBuilder.SetCustomAttribute(attributeBuilder)

         Dim myAttributeType2 As Type = GetType(MyAttribute2)
         ' Create a Constructorinfo object for attribute 'MyAttribute2'.
         Dim myConstructorInfo2 As ConstructorInfo = _
                  myAttributeType2.GetConstructor(New Type(0) {GetType(Boolean)})
         ' Set the CustomAttribute 'MyAttribute2' to the Field.
         myFieldBuilder.SetCustomAttribute(myConstructorInfo2, New Byte() {1, 0, 1, 0, 0})

         ' Create a method.
         Dim myMethodBuilder As MethodBuilder = myTypeBuilder.DefineMethod("MyMethod", _
               MethodAttributes.Public, Nothing, New Type(1) {GetType(String), GetType(Integer)})
         Dim myILGenerator As ILGenerator = myMethodBuilder.GetILGenerator()
         myILGenerator.Emit(OpCodes.Ldarg_0)
         myILGenerator.Emit(OpCodes.Ldarg_1)
         myILGenerator.Emit(OpCodes.Stfld, myFieldBuilder)
         myILGenerator.EmitWriteLine("Value of the Field is :")
         myILGenerator.EmitWriteLine(myFieldBuilder)
         myILGenerator.Emit(OpCodes.Ret)

         Return myTypeBuilder.CreateType()
      End Function 'CreateCallee

      Public Shared Sub Main()
         Try
            Dim myCustomClass As Type = CreateCallee(Thread.GetDomain())
            ' Construct an instance of a type.
            Dim myObject As Object = Activator.CreateInstance(myCustomClass)
            Console.WriteLine("FieldBuilder Sample")
            ' Find a method in this type and call it on this object.
            Dim myMethodInfo As MethodInfo = myCustomClass.GetMethod("MyMethod")
            myMethodInfo.Invoke(myObject, New Object(1) {"Sample string", 3})
            ' Retrieve the values of Attributes applied to field and display to console.
            Dim myFieldInfo As FieldInfo() = myCustomClass.GetFields()
            Dim i As Integer
            For i = 0 To myFieldInfo.Length - 1
               Dim attributes As Object() = myFieldInfo(i).GetCustomAttributes(True)
               Dim index As Integer
               For index = 0 To attributes.Length - 1
                  If TypeOf attributes(index) Is MyAttribute1 Then
                     Dim myCustomAttribute As MyAttribute1 =  _
                                    CType(attributes(index), MyAttribute1)
                     Console.WriteLine("Attribute Value of (MyAttribute1): " _
                                    + myCustomAttribute.myCustomAttributeValue.ToString())
                  End If
                  If TypeOf attributes(index) Is MyAttribute2 Then
                     Dim myCustomAttribute As MyAttribute2 = _
                                    CType(attributes(index), MyAttribute2)
                     Console.WriteLine("Attribute Value of (MyAttribute2): " _
                                       + myCustomAttribute.myCustomAttributeValue.ToString())
                  End If
               Next index
            Next i
         Catch e as Exception
            Console.WriteLine("Exception Caught "+e.Message)
         End Try
      End Sub
   End Class
End Namespace 'MySample

Применяется к

SetCustomAttribute(ConstructorInfo, Byte[])

Исходный код:
FieldBuilder.cs
Исходный код:
FieldBuilder.cs
Исходный код:
FieldBuilder.cs

Задает настраиваемый атрибут с помощью большого двоичного объекта пользовательских атрибутов.

public:
 void SetCustomAttribute(System::Reflection::ConstructorInfo ^ con, cli::array <System::Byte> ^ binaryAttribute);
public void SetCustomAttribute (System.Reflection.ConstructorInfo con, byte[] binaryAttribute);
[System.Runtime.InteropServices.ComVisible(true)]
public void SetCustomAttribute (System.Reflection.ConstructorInfo con, byte[] binaryAttribute);
member this.SetCustomAttribute : System.Reflection.ConstructorInfo * byte[] -> unit
[<System.Runtime.InteropServices.ComVisible(true)>]
member this.SetCustomAttribute : System.Reflection.ConstructorInfo * byte[] -> unit
Public Sub SetCustomAttribute (con As ConstructorInfo, binaryAttribute As Byte())

Параметры

con
ConstructorInfo

Конструктор настраиваемого атрибута.

binaryAttribute
Byte[]

Большой двоичный объект байтов, предоставляющий атрибуты.

Атрибуты

Исключения

Параметр con или binaryAttribute имеет значение null.

Родительский тип данного поля закрыт.

Примеры

В следующем примере кода показано использование SetCustomAttribute в контексте с использованием большого FieldBuilderдвоичного объекта байтов.

using namespace System;
using namespace System::Threading;
using namespace System::Reflection;
using namespace System::Reflection::Emit;

[AttributeUsage(AttributeTargets::All,AllowMultiple=false)]
public ref class MyAttribute1: public Attribute
{
public:
   String^ myCustomAttributeValue;
   MyAttribute1( String^ myString )
   {
      myCustomAttributeValue = myString;
   }
};


[AttributeUsage(AttributeTargets::All,AllowMultiple=false)]
public ref class MyAttribute2: public Attribute
{
public:
   bool myCustomAttributeValue;
   MyAttribute2( bool myBool )
   {
      myCustomAttributeValue = myBool;
   }
};

Type^ CreateCallee( AppDomain^ currentDomain )
{
   // Create a simple name for the assembly.
   AssemblyName^ myAssemblyName = gcnew AssemblyName;
   myAssemblyName->Name = "EmittedAssembly";

   // Create the called dynamic assembly.
   AssemblyBuilder^ myAssemblyBuilder = currentDomain->DefineDynamicAssembly( myAssemblyName, AssemblyBuilderAccess::RunAndSave );
   ModuleBuilder^ myModuleBuilder = myAssemblyBuilder->DefineDynamicModule( "EmittedModule", "EmittedModule.mod" );

   // Define a public class named 'CustomClass' in the assembly.
   TypeBuilder^ myTypeBuilder = myModuleBuilder->DefineType( "CustomClass", TypeAttributes::Public );

   // Define a private String field named 'MyField' in the type.
   FieldBuilder^ myFieldBuilder = myTypeBuilder->DefineField( "MyField", String::typeid, FieldAttributes::Public );
   Type^ myAttributeType1 = MyAttribute1::typeid;

   // Create a Constructorinfo Object* for attribute 'MyAttribute1'.
   array<Type^>^type1 = {String::typeid};
   ConstructorInfo^ myConstructorInfo = myAttributeType1->GetConstructor( type1 );

   // Create the CustomAttribute instance of attribute of type 'MyAttribute1'.
   array<Object^>^obj1 = {"Test"};
   CustomAttributeBuilder^ attributeBuilder = gcnew CustomAttributeBuilder( myConstructorInfo,obj1 );

   // Set the CustomAttribute 'MyAttribute1' to the Field.
   myFieldBuilder->SetCustomAttribute( attributeBuilder );
   Type^ myAttributeType2 = MyAttribute2::typeid;

   // Create a Constructorinfo Object* for attribute 'MyAttribute2'.
   array<Type^>^type2 = {bool::typeid};
   ConstructorInfo^ myConstructorInfo2 = myAttributeType2->GetConstructor( type2 );

   // Set the CustomAttribute 'MyAttribute2' to the Field.
   array<Byte>^bytes = {01,00,01,00,00};
   myFieldBuilder->SetCustomAttribute( myConstructorInfo2, bytes );

   // Create a method.
   array<Type^>^type3 = {String::typeid,int::typeid};
   MethodBuilder^ myMethodBuilder = myTypeBuilder->DefineMethod( "MyMethod", MethodAttributes::Public, nullptr, type3 );
   ILGenerator^ myILGenerator = myMethodBuilder->GetILGenerator();
   myILGenerator->Emit( OpCodes::Ldarg_0 );
   myILGenerator->Emit( OpCodes::Ldarg_1 );
   myILGenerator->Emit( OpCodes::Stfld, myFieldBuilder );
   myILGenerator->EmitWriteLine( "Value of the Field is :" );
   myILGenerator->EmitWriteLine( myFieldBuilder );
   myILGenerator->Emit( OpCodes::Ret );
   return myTypeBuilder->CreateType();
}

int main()
{
   try
   {
      Type^ myCustomClass = CreateCallee( Thread::GetDomain() );

      // Construct an instance of a type.
      Object^ myObject = Activator::CreateInstance( myCustomClass );
      Console::WriteLine( "FieldBuilder Sample" );

      // Find a method in this type and call it on this Object*.
      MethodInfo^ myMethodInfo = myCustomClass->GetMethod( "MyMethod" );
      array<Object^>^obj1 = {"Sample string",3};
      myMethodInfo->Invoke( myObject, obj1 );

      // Retrieve the values of Attributes applied to field and display to console.
      array<FieldInfo^>^myFieldInfo = myCustomClass->GetFields();
      for ( int i = 0; i < myFieldInfo->Length; i++ )
      {
         array<Object^>^attributes = myFieldInfo[ i ]->GetCustomAttributes( true );
         for ( int index = 0; index < attributes->Length; index++ )
         {
            if ( dynamic_cast<MyAttribute1^>(attributes[ index ]) )
            {
               MyAttribute1^ myCustomAttribute = safe_cast<MyAttribute1^>(attributes[ index ]);
               Console::WriteLine( "Attribute Value of (MyAttribute1): {0}", myCustomAttribute->myCustomAttributeValue );
            }
            if ( dynamic_cast<MyAttribute2^>(attributes[ index ]) )
            {
               MyAttribute2^ myCustomAttribute = safe_cast<MyAttribute2^>(attributes[ index ]);
               Console::WriteLine( "Attribute Value of (MyAttribute2): {0}", myCustomAttribute->myCustomAttributeValue );
            }
         }
      }
   }
   catch ( Exception^ e ) 
   {
      Console::WriteLine( "Exception Caught {0}", e->Message );
   }
}

using System;
using System.Threading;
using System.Reflection;
using System.Reflection.Emit;

namespace MySample
{
   [AttributeUsage(AttributeTargets.All, AllowMultiple = false)]
   public class MyAttribute1 :Attribute
   {
      public string myCustomAttributeValue;
      public MyAttribute1(string myString)
      {
         myCustomAttributeValue = myString;
      }
   }
   [AttributeUsage(AttributeTargets.All, AllowMultiple = false)]
   public class MyAttribute2 :Attribute
   {
      public bool myCustomAttributeValue;
      public MyAttribute2(bool myBool)
      {
         myCustomAttributeValue = myBool;
      }
   }

   class FieldBuilder_Sample
   {
      private static Type CreateCallee(AppDomain currentDomain)
      {

         // Create a simple name for the assembly.
         AssemblyName myAssemblyName = new AssemblyName();
         myAssemblyName.Name = "EmittedAssembly";
         // Create the called dynamic assembly.
         AssemblyBuilder myAssemblyBuilder =
            currentDomain.DefineDynamicAssembly(myAssemblyName, AssemblyBuilderAccess.RunAndSave);
         ModuleBuilder myModuleBuilder =
                  myAssemblyBuilder.DefineDynamicModule("EmittedModule","EmittedModule.mod");
         // Define a public class named 'CustomClass' in the assembly.
         TypeBuilder myTypeBuilder = myModuleBuilder.DefineType("CustomClass",
            TypeAttributes.Public);
         // Define a private String field named 'MyField' in the type.
         FieldBuilder myFieldBuilder =
            myTypeBuilder.DefineField("MyField", typeof(String), FieldAttributes.Public);
         Type myAttributeType1 = typeof(MyAttribute1);
         // Create a Constructorinfo object for attribute 'MyAttribute1'.
         ConstructorInfo myConstructorInfo = myAttributeType1.GetConstructor(
            new Type[1]{typeof(string)});
         // Create the CustomAttribute instance of attribute of type 'MyAttribute1'.
         CustomAttributeBuilder attributeBuilder =
                     new CustomAttributeBuilder( myConstructorInfo,new object[1]{"Test"});
         // Set the CustomAttribute 'MyAttribute1' to the Field.
         myFieldBuilder.SetCustomAttribute(attributeBuilder);

          Type myAttributeType2 = typeof(MyAttribute2);
         // Create a Constructorinfo object for attribute 'MyAttribute2'.
        ConstructorInfo myConstructorInfo2 = myAttributeType2.GetConstructor(
            new Type[1]{typeof(bool)});
         // Set the CustomAttribute 'MyAttribute2' to the Field.
         myFieldBuilder.SetCustomAttribute(myConstructorInfo2,new byte[]{01,00,01,00,00});

         // Create a method.
         MethodBuilder myMethodBuilder= myTypeBuilder.DefineMethod("MyMethod",
            MethodAttributes.Public,null,new Type[2]{typeof(string),typeof(int)});

         ILGenerator myILGenerator = myMethodBuilder.GetILGenerator();
         myILGenerator.Emit(OpCodes.Ldarg_0);
         myILGenerator.Emit(OpCodes.Ldarg_1);
         myILGenerator.Emit(OpCodes.Stfld, myFieldBuilder);
         myILGenerator.EmitWriteLine("Value of the Field is :");
         myILGenerator.EmitWriteLine(myFieldBuilder);
         myILGenerator.Emit(OpCodes.Ret);

         return myTypeBuilder.CreateType();
      }
      public static void Main()
      {
         try
         {
            Type myCustomClass = CreateCallee(Thread.GetDomain());
            // Construct an instance of a type.
            Object myObject = Activator.CreateInstance(myCustomClass);
            Console.WriteLine( "FieldBuilder Sample");
            // Find a method in this type and call it on this object.
            MethodInfo myMethodInfo = myCustomClass.GetMethod("MyMethod");
            myMethodInfo.Invoke(myObject, new object[2]{"Sample string",3});
            // Retrieve the values of Attributes applied to field and display to console.
            FieldInfo[] myFieldInfo = myCustomClass.GetFields();
            for(int i =0;i<myFieldInfo.Length;i++)
            {
               object[] attributes = myFieldInfo[i].GetCustomAttributes(true);
               for(int index=0; index < attributes.Length; index++)
               {
                  if(attributes[index] is MyAttribute1)
                  {
                     MyAttribute1 myCustomAttribute = (MyAttribute1)attributes[index];
                     Console.WriteLine("Attribute Value of (MyAttribute1): "
                                       + myCustomAttribute.myCustomAttributeValue);
                  }
                  if(attributes[index] is MyAttribute2)
                  {
                     MyAttribute2 myCustomAttribute = (MyAttribute2)attributes[index];
                     Console.WriteLine("Attribute Value of (MyAttribute2): "
                                       + myCustomAttribute.myCustomAttributeValue);
                  }
               }
            }
         }
         catch (Exception e)
         {
            Console.WriteLine("Exception Caught "+e.Message);
         }
      }
   }
}
Imports System.Threading
Imports System.Reflection
Imports System.Reflection.Emit

Namespace MySample
   <AttributeUsage(AttributeTargets.All, AllowMultiple:=False)> Public Class MyAttribute1
      Inherits Attribute
      Public myCustomAttributeValue As String

      Public Sub New(ByVal myString As String)
         myCustomAttributeValue = myString
      End Sub
   End Class
   <AttributeUsage(AttributeTargets.All, AllowMultiple:=False)> Public Class MyAttribute2
      Inherits Attribute
      Public myCustomAttributeValue As Boolean

      Public Sub New(ByVal myBool As Boolean)
         myCustomAttributeValue = myBool
      End Sub
   End Class

   Class FieldBuilder_Sample

      Private Shared Function CreateCallee(ByVal currentDomain As AppDomain) As Type
         ' Create a simple name for the assembly.
         Dim myAssemblyName As New AssemblyName()
         myAssemblyName.Name = "EmittedAssembly"
         ' Create the called dynamic assembly.
         Dim myAssemblyBuilder As AssemblyBuilder = _
                     currentDomain.DefineDynamicAssembly(myAssemblyName, _
                     AssemblyBuilderAccess.RunAndSave)
         Dim myModuleBuilder As ModuleBuilder = _
               myAssemblyBuilder.DefineDynamicModule("EmittedModule", _
                                                   "EmittedModule.mod")
         ' Define a public class named 'CustomClass' in the assembly.
         Dim myTypeBuilder As TypeBuilder = myModuleBuilder.DefineType("CustomClass", _
                                                TypeAttributes.Public)
         ' Define a private String field named 'MyField' in the type.
         Dim myFieldBuilder As FieldBuilder = myTypeBuilder.DefineField("MyField", _
                                       GetType(String), FieldAttributes.Public)
         Dim myAttributeType1 As Type = GetType(MyAttribute1)
         ' Create a Constructorinfo object for attribute 'MyAttribute1'.
         Dim myConstructorInfo As ConstructorInfo = _
                     myAttributeType1.GetConstructor(New Type(0) {GetType(String)})
         ' Create the CustomAttribute instance of attribute of type 'MyAttribute1'.
         Dim attributeBuilder As _
         New CustomAttributeBuilder(myConstructorInfo, New Object(0) {"Test"})
         ' Set the CustomAttribute 'MyAttribute1' to the Field.
         myFieldBuilder.SetCustomAttribute(attributeBuilder)

         Dim myAttributeType2 As Type = GetType(MyAttribute2)
         ' Create a Constructorinfo object for attribute 'MyAttribute2'.
         Dim myConstructorInfo2 As ConstructorInfo = _
                  myAttributeType2.GetConstructor(New Type(0) {GetType(Boolean)})
         ' Set the CustomAttribute 'MyAttribute2' to the Field.
         myFieldBuilder.SetCustomAttribute(myConstructorInfo2, New Byte() {1, 0, 1, 0, 0})

         ' Create a method.
         Dim myMethodBuilder As MethodBuilder = myTypeBuilder.DefineMethod("MyMethod", _
               MethodAttributes.Public, Nothing, New Type(1) {GetType(String), GetType(Integer)})
         Dim myILGenerator As ILGenerator = myMethodBuilder.GetILGenerator()
         myILGenerator.Emit(OpCodes.Ldarg_0)
         myILGenerator.Emit(OpCodes.Ldarg_1)
         myILGenerator.Emit(OpCodes.Stfld, myFieldBuilder)
         myILGenerator.EmitWriteLine("Value of the Field is :")
         myILGenerator.EmitWriteLine(myFieldBuilder)
         myILGenerator.Emit(OpCodes.Ret)

         Return myTypeBuilder.CreateType()
      End Function 'CreateCallee

      Public Shared Sub Main()
         Try
            Dim myCustomClass As Type = CreateCallee(Thread.GetDomain())
            ' Construct an instance of a type.
            Dim myObject As Object = Activator.CreateInstance(myCustomClass)
            Console.WriteLine("FieldBuilder Sample")
            ' Find a method in this type and call it on this object.
            Dim myMethodInfo As MethodInfo = myCustomClass.GetMethod("MyMethod")
            myMethodInfo.Invoke(myObject, New Object(1) {"Sample string", 3})
            ' Retrieve the values of Attributes applied to field and display to console.
            Dim myFieldInfo As FieldInfo() = myCustomClass.GetFields()
            Dim i As Integer
            For i = 0 To myFieldInfo.Length - 1
               Dim attributes As Object() = myFieldInfo(i).GetCustomAttributes(True)
               Dim index As Integer
               For index = 0 To attributes.Length - 1
                  If TypeOf attributes(index) Is MyAttribute1 Then
                     Dim myCustomAttribute As MyAttribute1 =  _
                                    CType(attributes(index), MyAttribute1)
                     Console.WriteLine("Attribute Value of (MyAttribute1): " _
                                    + myCustomAttribute.myCustomAttributeValue.ToString())
                  End If
                  If TypeOf attributes(index) Is MyAttribute2 Then
                     Dim myCustomAttribute As MyAttribute2 = _
                                    CType(attributes(index), MyAttribute2)
                     Console.WriteLine("Attribute Value of (MyAttribute2): " _
                                       + myCustomAttribute.myCustomAttributeValue.ToString())
                  End If
               Next index
            Next i
         Catch e as Exception
            Console.WriteLine("Exception Caught "+e.Message)
         End Try
      End Sub
   End Class
End Namespace 'MySample

Комментарии

Сведения о форматировании binaryAttributeсм. в спецификации метаданных в разделе II спецификации COMMON Language Infrastructure (CLI).

Применяется к