次の方法で共有


EnumBuilder.SetCustomAttribute メソッド (ConstructorInfo, Byte[])

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

Overloads Public Sub SetCustomAttribute( _
   ByVal con As ConstructorInfo, _   ByVal binaryAttribute() As Byte _)
[C#]
public void SetCustomAttribute(ConstructorInfocon,byte[] binaryAttribute);
[C++]
public: void SetCustomAttribute(ConstructorInfo* con,unsigned charbinaryAttribute __gc[]);
[JScript]
public function SetCustomAttribute(
   con : ConstructorInfo,binaryAttribute : Byte[]);

パラメータ

  • con
    カスタム属性用のコンストラクタ。
  • binaryAttribute
    属性を表すバイト BLOB。

例外

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

解説

binaryAttribute の書式設定方法については、ECMA Partition II のマニュアルのメタデータの仕様を参照してください。Partition II のマニュアルは .NET Framework SDK のインストールに含まれています。これは %\Microsoft.NET\FrameworkSDK\Tool Developers Guide\docs ディレクトリにあります。

使用例

[Visual Basic, C#, C++] 次のコード例は、 EnumBuilder のコンテキストで、バイト BLOB を渡す SetCustomAttribute の使用方法を示しています。

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

<AttributeUsage(AttributeTargets.All, AllowMultiple := False)>  _
Public Class MyAttribute
   Inherits Attribute
   Public myBoolValue As Boolean
   
   Public Sub New(myBool As Boolean)
      Me.myBoolValue = myBool
   End Sub 'New
End Class 'MyAttribute

Class MyApplication
   Private Shared myEnumBuilder As EnumBuilder
   
   Public Shared Sub Main()
      Try
         CreateCallee(Thread.GetDomain())
         Dim myAttributesArray As Object() = myEnumBuilder.GetCustomAttributes(True)
         
         ' Read the attributes and display them on the console.
         Console.WriteLine("Custom attribute contains: ")
         Dim index As Integer
         For index = 0 To myAttributesArray.Length - 1
            If TypeOf myAttributesArray(index) Is MyAttribute Then
               Console.WriteLine("myBoolValue: " + CType(myAttributesArray(index), MyAttribute). _
                                                                           myBoolValue.ToString())
            End If
         Next index
      Catch e As Exception
         Console.WriteLine("The following exception is raised:" + e.Message)
      End Try
   End Sub 'Main
   
   Private Shared Sub CreateCallee(___domain As AppDomain)
      Dim myAssemblyName As New AssemblyName()
      ' Create a name for the assembly.
      myAssemblyName.Name = "EmittedAssembly"
      
      ' Create the dynamic assembly.
      Dim myAssemblyBuilder As AssemblyBuilder = ___domain.DefineDynamicAssembly(myAssemblyName, _
                                                                  AssemblyBuilderAccess.Run)
      
      Dim myType As Type = GetType(MyAttribute)
      Dim myInfo As ConstructorInfo = myType.GetConstructor(New Type() {GetType(Boolean)})
      
      ' Create a dynamic module.
      Dim myModuleBuilder As ModuleBuilder = myAssemblyBuilder.DefineDynamicModule("EmittedModule")
      
      ' Create a dynamic Enum.
      myEnumBuilder = myModuleBuilder.DefineEnum("MyNamespace.MyEnum", TypeAttributes.Public, _
                                                                              GetType(Int32))
      
      Dim myFieldBuilder1 As FieldBuilder = myEnumBuilder.DefineLiteral("FieldOne", 1)
      Dim myFieldBuilder2 As FieldBuilder = myEnumBuilder.DefineLiteral("FieldTwo", 2)
      
      myEnumBuilder.CreateType()
      myEnumBuilder.SetCustomAttribute(myInfo, New Byte() {1, 0, 1})
   End Sub 'CreateCallee 
End Class 'MyApplication

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


[AttributeUsage(AttributeTargets.All, AllowMultiple = false)]
public class MyAttribute : Attribute
{
   public bool myBoolValue;

   public MyAttribute(bool myBool)
   {
      this.myBoolValue = myBool;
   }
}

class MyApplication
{
   static EnumBuilder myEnumBuilder;
   
   public static void Main()
   {
      try
      {
         CreateCallee(Thread.GetDomain());
         object[] myAttributesArray = myEnumBuilder.GetCustomAttributes(true);

         // Read the attributes and display them on the console.
         Console.WriteLine("Custom attribute contains: ");
         for(int index=0; index < myAttributesArray.Length; index++)
         {
            if(myAttributesArray[index] is MyAttribute)
            {
               Console.WriteLine("myBoolValue: " + 
                                       ((MyAttribute)myAttributesArray[index]).myBoolValue);
            }
         }
      }
      catch(Exception e)
      {
         Console.WriteLine("The following exception is raised:" +e.Message);
      }
   }

   private static void CreateCallee(AppDomain ___domain)
   {
      AssemblyName myAssemblyName = new AssemblyName();
      // Create a name for the assembly.
      myAssemblyName.Name = "EmittedAssembly";
     
      // Create the dynamic assembly.
      AssemblyBuilder myAssemblyBuilder 
                  = ___domain.DefineDynamicAssembly(myAssemblyName, AssemblyBuilderAccess.Run); 
      
      Type myType = typeof(MyAttribute);
      ConstructorInfo myInfo = myType.GetConstructor(new Type[]{typeof(bool)});
                  
      // Create a dynamic module.
      ModuleBuilder myModuleBuilder = myAssemblyBuilder.DefineDynamicModule("EmittedModule");
      
      // Create a dynamic Enum.
      myEnumBuilder = 
         myModuleBuilder.DefineEnum("MyNamespace.MyEnum", TypeAttributes.Public, typeof(Int32));

      FieldBuilder myFieldBuilder1 = myEnumBuilder.DefineLiteral("FieldOne", 1);
      FieldBuilder myFieldBuilder2 = myEnumBuilder.DefineLiteral("FieldTwo", 2);  

      myEnumBuilder.CreateType();
      myEnumBuilder.SetCustomAttribute(myInfo, new byte[]{01,00,01});
      
   }
}

[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:
   bool myBoolValue;

public:
   MyAttribute(bool myBool)
   {
      this->myBoolValue = myBool;
   }
};

__gc class MyApplication
{
   static EnumBuilder* myEnumBuilder;

public:   
   static void Main()
   {
      try
      {
         CreateCallee(Thread::GetDomain());
         Object* myAttributesArray[] = myEnumBuilder->GetCustomAttributes(true);

         // Read the attributes and display them on the console.
         Console::WriteLine(S"Custom attribute contains: ");
         for(int index=0; index < myAttributesArray->Length; index++)
         {
            if(dynamic_cast<MyAttribute*>(myAttributesArray[index]))
            {
               Console::WriteLine(S"myBoolValue: {0}",
                  __box((dynamic_cast<MyAttribute*>(myAttributesArray[index]))->myBoolValue));
            }
         }
      }
      catch(Exception* e)
      {
         Console::WriteLine(S"The following exception is raised:{0}", e->Message);
      }
   }

private:
   static void CreateCallee(AppDomain* ___domain)
   {
      AssemblyName* myAssemblyName = new AssemblyName();
      // Create a name for the assembly.
      myAssemblyName->Name = S"EmittedAssembly";

      // Create the dynamic assembly.
      AssemblyBuilder* myAssemblyBuilder 
         = ___domain->DefineDynamicAssembly(myAssemblyName, AssemblyBuilderAccess::Run); 

      Type* myType = __typeof(MyAttribute);

      Type* temp0 [] = {__typeof(bool)};
      ConstructorInfo* myInfo = myType->GetConstructor(temp0);

      // Create a dynamic module.
      ModuleBuilder* myModuleBuilder = myAssemblyBuilder->DefineDynamicModule(S"EmittedModule");

      // Create a dynamic Enum.
      myEnumBuilder = 
         myModuleBuilder->DefineEnum(S"MyNamespace.MyEnum", TypeAttributes::Public, __typeof(Int32));

      FieldBuilder* myFieldBuilder1 = myEnumBuilder->DefineLiteral(S"FieldOne",__box(1));
      FieldBuilder* myFieldBuilder2 = myEnumBuilder->DefineLiteral(S"FieldTwo",__box(2));  

      myEnumBuilder->CreateType();

      Byte temp1 [] = {01,00,01};
      myEnumBuilder->SetCustomAttribute(myInfo, temp1);

   }
};

int main()
{
   MyApplication::Main();
}

[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 ファミリ

参照

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