次の方法で共有


ConstructorBuilder.SetCustomAttribute メソッド (CustomAttributeBuilder)

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

Overloads Public Sub SetCustomAttribute( _
   ByVal customBuilder As CustomAttributeBuilder _)
[C#]
public void SetCustomAttribute(CustomAttributeBuildercustomBuilder);
[C++]
public: void SetCustomAttribute(CustomAttributeBuilder* customBuilder);
[JScript]
public function SetCustomAttribute(
   customBuilder : CustomAttributeBuilder);

パラメータ

  • customBuilder
    カスタム属性を定義するためのヘルパ クラスのインスタンス。

例外

例外の種類 条件
ArgumentNullException customBuilder が null 参照 (Visual Basic では Nothing) です。

使用例

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

 
Imports System
Imports System.Threading
Imports System.Reflection
Imports System.Reflection.Emit


<AttributeUsage(AttributeTargets.All, AllowMultiple := False)>  _
Public Class MyAttribute
   Inherits Attribute
   Public myString As String
   Public myInteger As Integer
   
   Public Sub New(myString As String, myInteger As Integer)
      Me.myString = myString
      Me.myInteger = myInteger
   End Sub 'New
End Class 'MyAttribute

Public Class MyConstructorBuilder
   
   Public Shared Sub Main()
      Dim myHelloworld As Type = MyCreateCallee(Thread.GetDomain())
      Dim myConstructor As ConstructorInfo = myHelloworld.GetConstructor(New Type() _ 
                                                                       {GetType(String)})
      Dim myAttributes1 As Object() = myConstructor.GetCustomAttributes(True)
      Console.WriteLine("MyAttribute custom attribute contains  ")
      Dim index As Integer
      For index = 0 To myAttributes1.Length - 1
         If TypeOf myAttributes1(index) Is MyAttribute Then
            Console.WriteLine("The value of myString is : " + CType(myAttributes1(index), _ 
                                                                       MyAttribute).myString)
            Console.WriteLine("The value of myInteger is : " + CType(myAttributes1(index), _ 
                                                            MyAttribute).myInteger.ToString())
         End If
      Next index
   End Sub 'Main
   
   Private Shared Function MyCreateCallee(___domain As AppDomain) As Type
      Dim myAssemblyName As New AssemblyName()
      myAssemblyName.Name = "EmittedAssembly"
      ' Define a dynamic assembly in the current application ___domain.
      Dim myAssembly As AssemblyBuilder = ___domain.DefineDynamicAssembly _ 
                                          (myAssemblyName, AssemblyBuilderAccess.Run)
      ' Define a dynamic module in this assembly.
      Dim myModuleBuilder As ModuleBuilder = myAssembly.DefineDynamicModule("EmittedModule")
      ' Construct a 'TypeBuilder' given the name and attributes.
      Dim myTypeBuilder As TypeBuilder = myModuleBuilder.DefineType _ 
                                                       ("HelloWorld", TypeAttributes.Public)
      ' Define a constructor of the dynamic class.
      Dim myConstructor As ConstructorBuilder = myTypeBuilder.DefineConstructor _ 
             (MethodAttributes.Public, CallingConventions.Standard, New Type() {GetType(String)})
      Dim myILGenerator As ILGenerator = myConstructor.GetILGenerator()
      myILGenerator.Emit(OpCodes.Ldstr, "Constructor is invoked")
      myILGenerator.Emit(OpCodes.Ldarg_1)
      Dim myMethodInfo As MethodInfo = GetType(Console).GetMethod("WriteLine", New Type() _ 
                                                                           {GetType(String)})
      myILGenerator.Emit(OpCodes.Call, myMethodInfo)
      myILGenerator.Emit(OpCodes.Ret)
      Dim myType As Type = GetType(MyAttribute)
      Dim myConstructorInfo As ConstructorInfo = myType.GetConstructor(New Type(1) _ 
                                                           {GetType(String), GetType(Integer)})
      Dim attributeBuilder As New CustomAttributeBuilder _ 
                                  (myConstructorInfo, New Object(1) {"Hello", 2})
      Try
         myConstructor.SetCustomAttribute(attributeBuilder)
      Catch ex As ArgumentNullException
         Console.WriteLine("The following exception has occured : " + ex.Message)
      Catch ex As Exception
         Console.WriteLine("The following exception has occured : " + ex.Message)
      End Try
      Return myTypeBuilder.CreateType()
   End Function 'MyCreateCallee
End Class 'MyConstructorBuilder

[C#] 
using System;
using System.Threading;
using System.Reflection;
using System.Reflection.Emit;


[AttributeUsage(AttributeTargets.All, AllowMultiple = false)]
public class MyAttribute : Attribute
{
   public String myString;
   public int myInteger;
   public MyAttribute(String myString, int myInteger)
   {
      this.myString = myString;
      this.myInteger = myInteger;
   }
}

public class MyConstructorBuilder
{
   public static void Main()
   {
      Type myHelloworld = MyCreateCallee(Thread.GetDomain());
      ConstructorInfo myConstructor = myHelloworld.GetConstructor(new Type[]{typeof(String)});
      object[] myAttributes1 = myConstructor.GetCustomAttributes(true);
      Console.WriteLine("MyAttribute custom attribute contains  ");
      for(int index=0; index < myAttributes1.Length; index++)
      {
         if(myAttributes1[index] is MyAttribute)
         {
            Console.WriteLine("The value of myString is : " 
                                       + ((MyAttribute)myAttributes1[index]).myString);
            Console.WriteLine("The value of myInteger is : " 
                                       + ((MyAttribute)myAttributes1[index]).myInteger);
         }
      }
   }

   private static Type MyCreateCallee(AppDomain ___domain)
   {
      AssemblyName myAssemblyName = new AssemblyName();
      myAssemblyName.Name = "EmittedAssembly";
      // Define a dynamic assembly in the current application ___domain.
      AssemblyBuilder myAssembly =
                  ___domain.DefineDynamicAssembly(myAssemblyName,AssemblyBuilderAccess.Run);
      // Define a dynamic module in this assembly.
      ModuleBuilder myModuleBuilder = myAssembly.DefineDynamicModule("EmittedModule");
       // Construct a 'TypeBuilder' given the name and attributes.
      TypeBuilder myTypeBuilder = myModuleBuilder.DefineType("HelloWorld",
         TypeAttributes.Public);
      // Define a constructor of the dynamic class.
      ConstructorBuilder myConstructor = myTypeBuilder.DefineConstructor(
               MethodAttributes.Public, CallingConventions.Standard, new Type[]{typeof(String)});
      ILGenerator myILGenerator = myConstructor.GetILGenerator();
      myILGenerator.Emit(OpCodes.Ldstr, "Constructor is invoked");
      myILGenerator.Emit(OpCodes.Ldarg_1);
      MethodInfo myMethodInfo =
                     typeof(Console).GetMethod("WriteLine",new Type[]{typeof(string)});
      myILGenerator.Emit(OpCodes.Call, myMethodInfo);
      myILGenerator.Emit(OpCodes.Ret);
      Type myType = typeof(MyAttribute);
      ConstructorInfo myConstructorInfo = myType.GetConstructor(new Type[2]{typeof(String), typeof(int)});
      CustomAttributeBuilder attributeBuilder =
         new CustomAttributeBuilder(myConstructorInfo, new object[2]{"Hello", 2});
      try
      {
         myConstructor.SetCustomAttribute(attributeBuilder);
      }
      catch(ArgumentNullException ex)
      {
         Console.WriteLine("The following exception has occured : "+ex.Message);
      }
      catch(Exception ex)
      {
         Console.WriteLine("The following exception has occured : "+ex.Message);
      }
      return myTypeBuilder.CreateType();
   }
}

[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 MyAttribute : public Attribute
{
public:
   String* myString;
   int myInteger;
   MyAttribute(String* myString, int myInteger) {
      this->myString = myString;
      this->myInteger = myInteger;
   }
};

static Type* MyCreateCallee(AppDomain* ___domain) {
   AssemblyName* myAssemblyName = new AssemblyName();
   myAssemblyName->Name = S"EmittedAssembly";
   // Define a dynamic assembly in the current application ___domain->
   AssemblyBuilder* myAssembly =
      ___domain->DefineDynamicAssembly(myAssemblyName, AssemblyBuilderAccess::Run);
   // Define a dynamic module in this assembly->
   ModuleBuilder* myModuleBuilder = myAssembly->DefineDynamicModule(S"EmittedModule");
   // Construct a 'TypeBuilder' given the name and attributes.
   TypeBuilder* myTypeBuilder = myModuleBuilder->DefineType(S"HelloWorld",
      TypeAttributes::Public);
   // Define a constructor of the dynamic class.
   Type* type1[] = {__typeof(String)};
   ConstructorBuilder* myConstructor = myTypeBuilder->DefineConstructor(MethodAttributes::Public, CallingConventions::Standard, type1);
   ILGenerator* myILGenerator = myConstructor->GetILGenerator();
   myILGenerator->Emit(OpCodes::Ldstr, S"Constructor is invoked");
   myILGenerator->Emit(OpCodes::Ldarg_1);
   Type* type2[] = {__typeof(String)};
   MethodInfo* myMethodInfo = __typeof(Console)->GetMethod(S"WriteLine", type2);
   myILGenerator->Emit(OpCodes::Call, myMethodInfo);
   myILGenerator->Emit(OpCodes::Ret);
   Type* myType = __typeof(MyAttribute);
   Type* type3[] = {__typeof(String), __typeof(int)};
   ConstructorInfo* myConstructorInfo = myType->GetConstructor(type3);
   Object* obj1[] = {S"Hello", __box(2)};
   CustomAttributeBuilder* attributeBuilder = new CustomAttributeBuilder(myConstructorInfo, obj1);
   try {
      myConstructor->SetCustomAttribute(attributeBuilder);
   } catch (ArgumentNullException* ex) {
      Console::WriteLine(S"The following exception has occured : {0}", ex->Message);
   } catch (Exception* ex) {
      Console::WriteLine(S"The following exception has occured : {0}", ex->Message);
   }
   return myTypeBuilder->CreateType();
}

void main() {
   Type* myHelloworld = MyCreateCallee(Thread::GetDomain());
   Type* type1[] = {__typeof(String)};
   ConstructorInfo* myConstructor = myHelloworld->GetConstructor(type1);
   Object* myAttributes1[] = myConstructor->GetCustomAttributes(true);
   Console::WriteLine(S"MyAttribute custom attribute contains  ");
   for (int index=0; index < myAttributes1->Length; index++) {
      if (dynamic_cast<MyAttribute*>(myAttributes1[index])) {
         Console::WriteLine(S"The value of myString is : {0}", (__try_cast<MyAttribute*>(myAttributes1[index]))->myString);
         Console::WriteLine(S"The value of myInteger is : {0}", __box((__try_cast<MyAttribute*>(myAttributes1[index]))->myInteger));
      }
   }
}

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

必要条件

プラットフォーム: Windows 98, Windows NT 4.0, Windows Millennium Edition, Windows 2000, Windows XP Home Edition, Windows XP Professional, Windows Server 2003 ファミリ

参照

ConstructorBuilder クラス | ConstructorBuilder メンバ | System.Reflection.Emit 名前空間 | ConstructorBuilder.SetCustomAttribute オーバーロードの一覧