Maison > développement back-end > C++ > Comment puis-je ajouter dynamiquement des attributs aux propriétés en C# sans l'erreur « La collection était de taille fixe » ?

Comment puis-je ajouter dynamiquement des attributs aux propriétés en C# sans l'erreur « La collection était de taille fixe » ?

Susan Sarandon
Libérer: 2025-01-03 01:22:39
original
892 Les gens l'ont consulté

How Can I Dynamically Add Attributes to Properties in C# Without the

Ajout dynamique d'attributs aux propriétés

Lors de la personnalisation des propriétés au moment de l'exécution, il est courant de rencontrer des problèmes lors de la tentative d'ajout d'attributs. L'erreur « La collection était d'une taille fixe » survient souvent dans de tels scénarios.

Dans l'extrait de code fourni, l'erreur se produit car la tentative d'ajout d'un attribut à une propriété existante implique la modification du descripteur de propriété, qui est immuable.

Pour résoudre ce problème, une approche consiste à créer une nouvelle propriété et à y ajouter les attributs souhaités. Cependant, cela nécessite de reconstruire le type, ce qui n'est pas efficace.

Une solution alternative et plus pratique consiste à exploiter les assemblys dynamiques. Cela permet de créer un nouveau type au moment de l'exécution, avec les attributs souhaités appliqués.

L'exemple de code suivant montre comment créer un type dynamique avec un attribut personnalisé :

using System;
using System.Reflection;
using System.Reflection.Emit;

public static class DynamicAttributeAddition
{
    public static void Main(string[] args)
    {
        // Define the assembly and module
        var assemblyName = new AssemblyName("DynamicAttributeAdditionAssembly");
        var assembly = AppDomain.CurrentDomain.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.Run);
        var module = assembly.DefineDynamicModule(assemblyName.Name);

        // Define the dynamic type
        var typeBuilder = module.DefineType("DynamicType", TypeAttributes.Public);

        // Define the custom attribute constructor
        var attributeConstructorParameters = new Type[] { typeof(string) };
        var attributeConstructor = typeof(CustomAttribute).GetConstructor(attributeConstructorParameters);

        // Define the custom attribute and add it to the dynamic type
        var attributeBuilder = new CustomAttributeBuilder(attributeConstructor, new object[] { "Some Value" });
        typeBuilder.SetCustomAttribute(attributeBuilder);

        // Create the dynamic type
        var dynamicType = typeBuilder.CreateType();

        // Get the custom attribute from the dynamic type
        var attribute = dynamicType.GetCustomAttributes(typeof(CustomAttribute), false).Single();

        // Print the attribute value
        Console.WriteLine(attribute.ConstructorArguments[0].Value);
    }
}
Copier après la connexion

Dans cette approche , nous créons un nouveau type et ajoutons l'attribut souhaité lors de sa définition. Cela nous permet de personnaliser dynamiquement les propriétés et leurs attributs sans modifier les objets existants.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal