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