CustomAttributeBuilder 클래스
정의
중요
일부 정보는 릴리스되기 전에 상당 부분 수정될 수 있는 시험판 제품과 관련이 있습니다. Microsoft는 여기에 제공된 정보에 대해 어떠한 명시적이거나 묵시적인 보증도 하지 않습니다.
사용자 지정 특성을 지정할 수 있도록 합니다.
public ref class CustomAttributeBuilder
public ref class CustomAttributeBuilder : System::Runtime::InteropServices::_CustomAttributeBuilder
public class CustomAttributeBuilder
[System.Runtime.InteropServices.ClassInterface(System.Runtime.InteropServices.ClassInterfaceType.None)]
public class CustomAttributeBuilder : System.Runtime.InteropServices._CustomAttributeBuilder
[System.Runtime.InteropServices.ClassInterface(System.Runtime.InteropServices.ClassInterfaceType.None)]
[System.Runtime.InteropServices.ComVisible(true)]
public class CustomAttributeBuilder : System.Runtime.InteropServices._CustomAttributeBuilder
type CustomAttributeBuilder = class
[<System.Runtime.InteropServices.ClassInterface(System.Runtime.InteropServices.ClassInterfaceType.None)>]
type CustomAttributeBuilder = class
interface _CustomAttributeBuilder
[<System.Runtime.InteropServices.ClassInterface(System.Runtime.InteropServices.ClassInterfaceType.None)>]
[<System.Runtime.InteropServices.ComVisible(true)>]
type CustomAttributeBuilder = class
interface _CustomAttributeBuilder
Public Class CustomAttributeBuilder
Public Class CustomAttributeBuilder
Implements _CustomAttributeBuilder
- 상속
-
CustomAttributeBuilder
- 특성
- 구현
예제
다음 코드 샘플에서는 의 CustomAttributeBuilder
사용을 보여 줍니다.
using namespace System;
using namespace System::Threading;
using namespace System::Reflection;
using namespace System::Reflection::Emit;
// We will apply this custom attribute to our dynamic type.
public ref class ClassCreator: public Attribute
{
private:
String^ creator;
public:
property String^ Creator
{
String^ get()
{
return creator;
}
}
ClassCreator( String^ name )
{
this->creator = name;
}
};
// We will apply this dynamic attribute to our dynamic method.
public ref class DateLastUpdated: public Attribute
{
private:
String^ dateUpdated;
public:
property String^ DateUpdated
{
String^ get()
{
return dateUpdated;
}
}
DateLastUpdated( String^ theDate )
{
this->dateUpdated = theDate;
}
};
Type^ BuildTypeWithCustomAttributesOnMethod()
{
AppDomain^ currentDomain = Thread::GetDomain();
AssemblyName^ myAsmName = gcnew AssemblyName;
myAsmName->Name = "MyAssembly";
AssemblyBuilder^ myAsmBuilder = currentDomain->DefineDynamicAssembly( myAsmName, AssemblyBuilderAccess::Run );
ModuleBuilder^ myModBuilder = myAsmBuilder->DefineDynamicModule( "MyModule" );
// First, we'll build a type with a custom attribute attached.
TypeBuilder^ myTypeBuilder = myModBuilder->DefineType( "MyType", TypeAttributes::Public );
array<Type^>^temp6 = {String::typeid};
array<Type^>^ctorParams = temp6;
ConstructorInfo^ classCtorInfo = ClassCreator::typeid->GetConstructor( ctorParams );
array<Object^>^temp0 = {"Joe Programmer"};
CustomAttributeBuilder^ myCABuilder = gcnew CustomAttributeBuilder( classCtorInfo,temp0 );
myTypeBuilder->SetCustomAttribute( myCABuilder );
// Now, let's build a method and add a custom attribute to it.
array<Type^>^temp1 = gcnew array<Type^>(0);
MethodBuilder^ myMethodBuilder = myTypeBuilder->DefineMethod( "HelloWorld", MethodAttributes::Public, nullptr, temp1 );
array<Type^>^temp7 = {String::typeid};
ctorParams = temp7;
classCtorInfo = DateLastUpdated::typeid->GetConstructor( ctorParams );
array<Object^>^temp2 = {DateTime::Now.ToString()};
CustomAttributeBuilder^ myCABuilder2 = gcnew CustomAttributeBuilder( classCtorInfo,temp2 );
myMethodBuilder->SetCustomAttribute( myCABuilder2 );
ILGenerator^ myIL = myMethodBuilder->GetILGenerator();
myIL->EmitWriteLine( "Hello, world!" );
myIL->Emit( OpCodes::Ret );
return myTypeBuilder->CreateType();
}
int main()
{
Type^ myType = BuildTypeWithCustomAttributesOnMethod();
Object^ myInstance = Activator::CreateInstance( myType );
array<Object^>^customAttrs = myType->GetCustomAttributes( true );
Console::WriteLine( "Custom Attributes for Type 'MyType':" );
Object^ attrVal = nullptr;
System::Collections::IEnumerator^ myEnum = customAttrs->GetEnumerator();
while ( myEnum->MoveNext() )
{
Object^ customAttr = safe_cast<Object^>(myEnum->Current);
array<Object^>^temp3 = gcnew array<Object^>(0);
attrVal = ClassCreator::typeid->InvokeMember( "Creator", BindingFlags::GetProperty, nullptr, customAttr, temp3 );
Console::WriteLine( "-- Attribute: [{0} = \"{1}\"]", customAttr, attrVal );
}
Console::WriteLine( "Custom Attributes for Method 'HelloWorld()' in 'MyType':" );
customAttrs = myType->GetMember( "HelloWorld" )[ 0 ]->GetCustomAttributes( true );
System::Collections::IEnumerator^ myEnum2 = customAttrs->GetEnumerator();
while ( myEnum2->MoveNext() )
{
Object^ customAttr = safe_cast<Object^>(myEnum2->Current);
array<Object^>^temp4 = gcnew array<Object^>(0);
attrVal = DateLastUpdated::typeid->InvokeMember( "DateUpdated", BindingFlags::GetProperty, nullptr, customAttr, temp4 );
Console::WriteLine( "-- Attribute: [{0} = \"{1}\"]", customAttr, attrVal );
}
Console::WriteLine( "---" );
array<Object^>^temp5 = gcnew array<Object^>(0);
Console::WriteLine( myType->InvokeMember( "HelloWorld", BindingFlags::InvokeMethod, nullptr, myInstance, temp5 ) );
}
using System;
using System.Threading;
using System.Reflection;
using System.Reflection.Emit;
// We will apply this custom attribute to our dynamic type.
public class ClassCreator: Attribute
{
private string creator;
public string Creator
{
get
{
return creator;
}
}
public ClassCreator(string name)
{
this.creator = name;
}
}
// We will apply this dynamic attribute to our dynamic method.
public class DateLastUpdated: Attribute
{
private string dateUpdated;
public string DateUpdated
{
get
{
return dateUpdated;
}
}
public DateLastUpdated(string theDate)
{
this.dateUpdated = theDate;
}
}
class MethodBuilderCustomAttributesDemo
{
public static Type BuildTypeWithCustomAttributesOnMethod()
{
AppDomain currentDomain = Thread.GetDomain();
AssemblyName myAsmName = new AssemblyName();
myAsmName.Name = "MyAssembly";
AssemblyBuilder myAsmBuilder = currentDomain.DefineDynamicAssembly(
myAsmName, AssemblyBuilderAccess.Run);
ModuleBuilder myModBuilder = myAsmBuilder.DefineDynamicModule("MyModule");
// First, we'll build a type with a custom attribute attached.
TypeBuilder myTypeBuilder = myModBuilder.DefineType("MyType",
TypeAttributes.Public);
Type[] ctorParams = new Type[] { typeof(string) };
ConstructorInfo classCtorInfo = typeof(ClassCreator).GetConstructor(ctorParams);
CustomAttributeBuilder myCABuilder = new CustomAttributeBuilder(
classCtorInfo,
new object[] { "Joe Programmer" });
myTypeBuilder.SetCustomAttribute(myCABuilder);
// Now, let's build a method and add a custom attribute to it.
MethodBuilder myMethodBuilder = myTypeBuilder.DefineMethod("HelloWorld",
MethodAttributes.Public,
null,
new Type[] { });
ctorParams = new Type[] { typeof(string) };
classCtorInfo = typeof(DateLastUpdated).GetConstructor(ctorParams);
CustomAttributeBuilder myCABuilder2 = new CustomAttributeBuilder(
classCtorInfo,
new object[] { DateTime.Now.ToString() });
myMethodBuilder.SetCustomAttribute(myCABuilder2);
ILGenerator myIL = myMethodBuilder.GetILGenerator();
myIL.EmitWriteLine("Hello, world!");
myIL.Emit(OpCodes.Ret);
return myTypeBuilder.CreateType();
}
public static void Main()
{
Type myType = BuildTypeWithCustomAttributesOnMethod();
object myInstance = Activator.CreateInstance(myType);
object[] customAttrs = myType.GetCustomAttributes(true);
Console.WriteLine("Custom Attributes for Type 'MyType':");
object attrVal = null;
foreach (object customAttr in customAttrs)
{
attrVal = typeof(ClassCreator).InvokeMember("Creator",
BindingFlags.GetProperty,
null, customAttr, new object[] { });
Console.WriteLine("-- Attribute: [{0} = \"{1}\"]", customAttr, attrVal);
}
Console.WriteLine("Custom Attributes for Method 'HelloWorld()' in 'MyType':");
customAttrs = myType.GetMember("HelloWorld")[0].GetCustomAttributes(true);
foreach (object customAttr in customAttrs)
{
attrVal = typeof(DateLastUpdated).InvokeMember("DateUpdated",
BindingFlags.GetProperty,
null, customAttr, new object[] { });
Console.WriteLine("-- Attribute: [{0} = \"{1}\"]", customAttr, attrVal);
}
Console.WriteLine("---");
Console.WriteLine(myType.InvokeMember("HelloWorld",
BindingFlags.InvokeMethod,
null, myInstance, new object[] { }));
}
}
Imports System.Threading
Imports System.Reflection
Imports System.Reflection.Emit
_
' We will apply this custom attribute to our dynamic type.
Public Class ClassCreator
Inherits Attribute
Private creator As String
Public ReadOnly Property GetCreator() As String
Get
Return creator
End Get
End Property
Public Sub New(name As String)
Me.creator = name
End Sub
End Class
_
' We will apply this dynamic attribute to our dynamic method.
Public Class DateLastUpdated
Inherits Attribute
Private dateUpdated As String
Public ReadOnly Property GetDateUpdated() As String
Get
Return dateUpdated
End Get
End Property
Public Sub New(theDate As String)
Me.dateUpdated = theDate
End Sub
End Class
_
Class MethodBuilderCustomAttributesDemo
Public Shared Function BuildTypeWithCustomAttributesOnMethod() As Type
Dim currentDomain As AppDomain = Thread.GetDomain()
Dim myAsmName As New AssemblyName()
myAsmName.Name = "MyAssembly"
Dim myAsmBuilder As AssemblyBuilder = currentDomain.DefineDynamicAssembly(myAsmName, _
AssemblyBuilderAccess.Run)
Dim myModBuilder As ModuleBuilder = myAsmBuilder.DefineDynamicModule("MyModule")
' First, we'll build a type with a custom attribute attached.
Dim myTypeBuilder As TypeBuilder = myModBuilder.DefineType("MyType", _
TypeAttributes.Public)
Dim ctorParams() As Type = {GetType(String)}
Dim classCtorInfo As ConstructorInfo = GetType(ClassCreator).GetConstructor(ctorParams)
Dim myCABuilder As New CustomAttributeBuilder(classCtorInfo, _
New Object() {"Joe Programmer"})
myTypeBuilder.SetCustomAttribute(myCABuilder)
' Now, let's build a method and add a custom attribute to it.
Dim myMethodBuilder As MethodBuilder = myTypeBuilder.DefineMethod("HelloWorld", _
MethodAttributes.Public, Nothing, New Type() {})
ctorParams = New Type() {GetType(String)}
classCtorInfo = GetType(DateLastUpdated).GetConstructor(ctorParams)
Dim myCABuilder2 As New CustomAttributeBuilder(classCtorInfo, _
New Object() {DateTime.Now.ToString()})
myMethodBuilder.SetCustomAttribute(myCABuilder2)
Dim myIL As ILGenerator = myMethodBuilder.GetILGenerator()
myIL.EmitWriteLine("Hello, world!")
myIL.Emit(OpCodes.Ret)
Return myTypeBuilder.CreateType()
End Function 'BuildTypeWithCustomAttributesOnMethod
Public Shared Sub Main()
Dim myType As Type = BuildTypeWithCustomAttributesOnMethod()
Dim myInstance As Object = Activator.CreateInstance(myType)
Dim customAttrs As Object() = myType.GetCustomAttributes(True)
Console.WriteLine("Custom Attributes for Type 'MyType':")
Dim attrVal As Object = Nothing
Dim customAttr As Object
For Each customAttr In customAttrs
attrVal = GetType(ClassCreator).InvokeMember("GetCreator", _
BindingFlags.GetProperty, _
Nothing, customAttr, New Object() {})
Console.WriteLine("-- Attribute: [{0} = ""{1}""]", customAttr, attrVal)
Next customAttr
Console.WriteLine("Custom Attributes for Method 'HelloWorld()' in 'MyType':")
customAttrs = myType.GetMember("HelloWorld")(0).GetCustomAttributes(True)
For Each customAttr In customAttrs
attrVal = GetType(DateLastUpdated).InvokeMember("GetDateUpdated", _
BindingFlags.GetProperty, _
Nothing, customAttr, New Object() {})
Console.WriteLine("-- Attribute: [{0} = ""{1}""]", customAttr, attrVal)
Next customAttr
Console.WriteLine("---")
Console.WriteLine(myType.InvokeMember("HelloWorld", BindingFlags.InvokeMethod, _
Nothing, myInstance, New Object() {}))
End Sub
End Class
설명
CustomAttributeBuilder
생성자가 반환한 개체를 사용하여 사용자 지정 특성을 설명합니다.
CustomAttribute
해당 작성기 instance 메서드를 호출하여 를 작성기 SetCustomAttribute
instance 연결합니다. 예를 들어 생성자 AssemblyCultureAttribute 및 해당 인수를 제공하여 의 AssemblyCultureAttribute
instance 설명하는 을 만듭니 CustomAttributeBuilder
다. 그런 다음 을 AssemblyBuilder
호출 SetCustomAttribute 하여 연결을 설정합니다.
생성자
CustomAttributeBuilder(ConstructorInfo, Object[]) |
지정된 사용자 지정 특성의 생성자와 생성자에 대한 인수를 사용하여 |
CustomAttributeBuilder(ConstructorInfo, Object[], FieldInfo[], Object[]) |
사용자 지정 특성의 생성자, 이 생성자에 대한 인수 및 명명된 필드/값 쌍 집합이 제공되면 |
CustomAttributeBuilder(ConstructorInfo, Object[], PropertyInfo[], Object[]) |
사용자 지정 특성의 생성자, 이 생성자에 대한 인수 및 명명된 속성 또는 값 쌍 집합이 제공되면 |
CustomAttributeBuilder(ConstructorInfo, Object[], PropertyInfo[], Object[], FieldInfo[], Object[]) |
사용자 지정 특성의 생성자, 이 생성자에 대한 인수, 명명된 속성/값 쌍 집합 또는 명명된 필드/값 쌍 집합이 제공되면 |
메서드
Equals(Object) |
지정된 개체가 현재 개체와 같은지 확인합니다. (다음에서 상속됨 Object) |
GetHashCode() |
기본 해시 함수로 작동합니다. (다음에서 상속됨 Object) |
GetType() |
현재 인스턴스의 Type을 가져옵니다. (다음에서 상속됨 Object) |
MemberwiseClone() |
현재 Object의 단순 복사본을 만듭니다. (다음에서 상속됨 Object) |
ToString() |
현재 개체를 나타내는 문자열을 반환합니다. (다음에서 상속됨 Object) |
명시적 인터페이스 구현
_CustomAttributeBuilder.GetIDsOfNames(Guid, IntPtr, UInt32, UInt32, IntPtr) |
이름 집합을 해당하는 디스패치 식별자 집합에 매핑합니다. |
_CustomAttributeBuilder.GetTypeInfo(UInt32, UInt32, IntPtr) |
인터페이스의 형식 정보를 가져오는 데 사용할 수 있는 개체의 형식 정보를 검색합니다. |
_CustomAttributeBuilder.GetTypeInfoCount(UInt32) |
개체에서 제공하는 형식 정보 인터페이스의 수를 검색합니다(0 또는 1). |
_CustomAttributeBuilder.Invoke(UInt32, Guid, UInt32, Int16, IntPtr, IntPtr, IntPtr, IntPtr) |
개체에서 노출하는 메서드와 속성에 대한 액세스를 제공합니다. |
적용 대상
.NET