次の方法で共有


FieldBuilder.SetCustomAttribute メソッド

カスタム属性を設定します。

オーバーロードの一覧

カスタム属性ビルダを使用して、カスタム属性を設定します。

[Visual Basic] Overloads Public Sub SetCustomAttribute(CustomAttributeBuilder)

[C#] public void SetCustomAttribute(CustomAttributeBuilder);

[C++] public: void SetCustomAttribute(CustomAttributeBuilder*);

[JScript] public function SetCustomAttribute(CustomAttributeBuilder);

指定されたカスタム属性 BLOB を使用して、カスタム属性を設定します。

[Visual Basic] Overloads Public Sub SetCustomAttribute(ConstructorInfo, Byte())

[C#] public void SetCustomAttribute(ConstructorInfo, byte[]);

[C++] public: void SetCustomAttribute(ConstructorInfo*, unsigned char __gc[]);

[JScript] public function SetCustomAttribute(ConstructorInfo, Byte[]);

使用例

[Visual Basic, C#, C++] FieldBuilder のコンテキストでバイト BLOB を使用する SetCustomAttribute の使用方法については、次のコード例を参照してください。

[Visual Basic, C#, C++] メモ   ここでは、SetCustomAttribute のオーバーロード形式のうちの 1 つだけについて、使用例を示します。その他の例については、各オーバーロード形式のトピックを参照してください。

 
Imports System
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 'New
   End Class 'MyAttribute1
   <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 'New
   End Class 'MyAttribute2

   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 'Main
   End Class 'FieldBuilder_Sample
End Namespace 'MySample

[C#] 

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);
         }
      }
   }
}

[C++] 

#using <mscorlib.dll>

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

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

[AttributeUsage(AttributeTargets::All, AllowMultiple = false)]
public __gc 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 = new AssemblyName();
   myAssemblyName->Name = S"EmittedAssembly";
   // Create the called dynamic assembly.
   AssemblyBuilder* myAssemblyBuilder =
      currentDomain->DefineDynamicAssembly(myAssemblyName, AssemblyBuilderAccess::RunAndSave);
   ModuleBuilder* myModuleBuilder =
      myAssemblyBuilder->DefineDynamicModule(S"EmittedModule", S"EmittedModule.mod");
   // Define a public class named 'CustomClass' in the assembly.
   TypeBuilder* myTypeBuilder = myModuleBuilder->DefineType(S"CustomClass",
      TypeAttributes::Public);
   // Define a private String field named 'MyField' in the type.
   FieldBuilder* myFieldBuilder =
      myTypeBuilder->DefineField(S"MyField", __typeof(String), FieldAttributes::Public);
   Type* myAttributeType1 = __typeof(MyAttribute1);
   // Create a Constructorinfo Object* for attribute 'MyAttribute1'.
   Type* type1[] = {__typeof(String)};
   ConstructorInfo* myConstructorInfo = myAttributeType1->GetConstructor(type1);
   // Create the CustomAttribute instance of attribute of type 'MyAttribute1'.
   Object* obj1[] = {S"Test"};
   CustomAttributeBuilder* attributeBuilder = new CustomAttributeBuilder(myConstructorInfo, obj1);
   // Set the CustomAttribute 'MyAttribute1' to the Field.
   myFieldBuilder->SetCustomAttribute(attributeBuilder);

   Type* myAttributeType2 = __typeof(MyAttribute2);
   // Create a Constructorinfo Object* for attribute 'MyAttribute2'.
   Type* type2[] = {__typeof(bool)};
   ConstructorInfo* myConstructorInfo2 = myAttributeType2->GetConstructor(type2);
   // Set the CustomAttribute 'MyAttribute2' to the Field.
   Byte bytes[] = {01, 00, 01, 00, 00};
   myFieldBuilder->SetCustomAttribute(myConstructorInfo2, bytes);

   // Create a method.
   Type* type3[] = {__typeof(String), __typeof(int)};
   MethodBuilder* myMethodBuilder= myTypeBuilder->DefineMethod(S"MyMethod",
      MethodAttributes::Public, 0, type3);

   ILGenerator* myILGenerator = myMethodBuilder->GetILGenerator();
   myILGenerator->Emit(OpCodes::Ldarg_0);
   myILGenerator->Emit(OpCodes::Ldarg_1);
   myILGenerator->Emit(OpCodes::Stfld, myFieldBuilder);
   myILGenerator->EmitWriteLine(S"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(S"FieldBuilder Sample");
      // Find a method in this type and call it on this Object*.
      MethodInfo* myMethodInfo = myCustomClass->GetMethod(S"MyMethod");
      Object* obj1[] = {S"Sample string", __box(3)};
      myMethodInfo->Invoke(myObject, obj1);
      // 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 (dynamic_cast<MyAttribute1*>(attributes[index])) {
               MyAttribute1* myCustomAttribute = __try_cast<MyAttribute1*>(attributes[index]);
               Console::WriteLine(S"Attribute Value of (MyAttribute1): {0}", myCustomAttribute->myCustomAttributeValue);
            }
            if (dynamic_cast<MyAttribute2*>(attributes[index])) {
               MyAttribute2* myCustomAttribute = __try_cast<MyAttribute2*>(attributes[index]);
               Console::WriteLine(S"Attribute Value of (MyAttribute2): {0}", __box(myCustomAttribute->myCustomAttributeValue));
            }
         }
      }
   } catch (Exception* e) {
      Console::WriteLine(S"Exception Caught {0}", e->Message);
   }
}

[JScript] JScript のサンプルはありません。Visual Basic、C#、および C++ のサンプルを表示するには、このページの左上隅にある言語のフィルタ ボタン 言語のフィルタ をクリックします。

参照

FieldBuilder クラス | FieldBuilder メンバ | System.Reflection.Emit 名前空間