カスタム属性を設定します。
オーバーロードの一覧
カスタム属性ビルダを使用して、カスタム属性を設定します。
[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 名前空間