Leggere in inglese

Condividi tramite


CustomAttributeBuilder Classe

Definizione

Consente di compilare attributi personalizzati.

C#
public class CustomAttributeBuilder
C#
[System.Runtime.InteropServices.ClassInterface(System.Runtime.InteropServices.ClassInterfaceType.None)]
public class CustomAttributeBuilder : System.Runtime.InteropServices._CustomAttributeBuilder
C#
[System.Runtime.InteropServices.ClassInterface(System.Runtime.InteropServices.ClassInterfaceType.None)]
[System.Runtime.InteropServices.ComVisible(true)]
public class CustomAttributeBuilder : System.Runtime.InteropServices._CustomAttributeBuilder
Ereditarietà
CustomAttributeBuilder
Attributi
Implementazioni

Esempio

Nell'esempio di codice seguente viene illustrato l'uso di CustomAttributeBuilder.

C#

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[] { }));
   }
}

Commenti

Utilizzare l'oggetto CustomAttributeBuilder restituito dal costruttore per descrivere l'attributo personalizzato. Associare a un'istanza CustomAttribute del generatore chiamando il metodo nell'istanza SetCustomAttribute del generatore. Ad esempio, creare un CustomAttributeBuilder oggetto per descrivere un'istanza di AssemblyCultureAttribute specificando il costruttore di AssemblyCultureAttribute e il relativo argomento. Quindi chiamare SetCustomAttribute su un AssemblyBuilder per stabilire l'associazione.

Costruttori

CustomAttributeBuilder(ConstructorInfo, Object[])

Inizializza un'istanza della classe CustomAttributeBuilder dati il costruttore dell'attributo personalizzato e gli argomenti per il costruttore.

CustomAttributeBuilder(ConstructorInfo, Object[], FieldInfo[], Object[])

Inizializza un'istanza della classe CustomAttributeBuilder, dati il costruttore dell'attributo personalizzato, gli argomenti al costruttore e un set di coppie campo/valore con nome.

CustomAttributeBuilder(ConstructorInfo, Object[], PropertyInfo[], Object[])

Inizializza un'istanza della classe CustomAttributeBuilder, dati il costruttore dell'attributo personalizzato, gli argomenti al costruttore e un set di coppie di proprietà o valori denominati.

CustomAttributeBuilder(ConstructorInfo, Object[], PropertyInfo[], Object[], FieldInfo[], Object[])

Inizializza un'istanza della classe CustomAttributeBuilder, dati il costruttore dell'attributo personalizzato, gli argomenti al costruttore e un set di coppie di proprietà o valori denominati e un set di coppie di campi o valori denominati.

Metodi

Equals(Object)

Determina se l'oggetto specificato è uguale all'oggetto corrente.

(Ereditato da Object)
GetHashCode()

Funge da funzione hash predefinita.

(Ereditato da Object)
GetType()

Ottiene l'oggetto Type dell'istanza corrente.

(Ereditato da Object)
MemberwiseClone()

Crea una copia superficiale dell'oggetto Object corrente.

(Ereditato da Object)
ToString()

Restituisce una stringa che rappresenta l'oggetto corrente.

(Ereditato da Object)

Implementazioni dell'interfaccia esplicita

_CustomAttributeBuilder.GetIDsOfNames(Guid, IntPtr, UInt32, UInt32, IntPtr)

Esegue il mapping di un set di nomi a un set corrispondente di ID dispatch.

_CustomAttributeBuilder.GetTypeInfo(UInt32, UInt32, IntPtr)

Recupera le informazioni sul tipo relative a un oggetto che può quindi essere usato per ottenere informazioni sul tipo relative a un'interfaccia.

_CustomAttributeBuilder.GetTypeInfoCount(UInt32)

Recupera il numero delle interfacce di informazioni sul tipo fornite da un oggetto (0 o 1).

_CustomAttributeBuilder.Invoke(UInt32, Guid, UInt32, Int16, IntPtr, IntPtr, IntPtr, IntPtr)

Fornisce l'accesso a proprietà e metodi esposti da un oggetto.

Si applica a

Prodotto Versioni
.NET Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Framework 1.1, 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 2.0, 2.1