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

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

Susan Sarandon
Libérer: 2025-01-02 22:42:40
original
706 Les gens l'ont consulté

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

Attribution dynamique d'attributs à des propriétés

Lors de votre tentative d'attribuer un attribut de validation à une propriété au moment de l'exécution, vous avez rencontré un message "La collection était de une exception de taille fixe. La raison derrière cette erreur est que la collection d'attributs du descripteur de propriété ne peut pas être modifiée directement. Notre objectif est d'explorer une approche alternative pour réaliser l'attribution d'attributs.

L'extrait de code fourni tente d'utiliser la méthode FillAttributes pour ajouter un attribut, mais cette méthode est généralement destinée à un usage interne et peut ne pas être accessible dans tous les domaines. cas. Une approche plus fiable consiste à créer un assembly et un type dynamiques, puis à attribuer les attributs au type nouvellement créé.

Plongeons dans un exemple :

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

public class ValidationAttribute : Attribute
{
    public string ErrorMessage { get; set; }
}

public class Person
{
    public string Name { get; set; }
}

class Program
{
    static void Main(string[] args)
    {
        AssemblyName assemblyName = new AssemblyName("MyPersonAssembly");
        AssemblyBuilder assemblyBuilder = AssemblyBuilder.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.RunAndSave);
        ModuleBuilder moduleBuilder = assemblyBuilder.DefineDynamicModule("MyPersonModule");
        TypeBuilder typeBuilder = moduleBuilder.DefineType("MyPerson", TypeAttributes.Public);

        PropertyBuilder namePropertyBuilder = typeBuilder.DefineProperty("Name", PropertyAttributes.None, typeof(string), null);

        ConstructorInfo attributeConstructor = typeof(ValidationAttribute).GetConstructor(new[] { typeof(string) });
        CustomAttributeBuilder attributeBuilder = new CustomAttributeBuilder(attributeConstructor, new object[] { "Name is required" });

        namePropertyBuilder.SetCustomAttribute(attributeBuilder);

        Type newPersonType = typeBuilder.CreateType();
        Person person = (Person)Activator.CreateInstance(newPersonType);
    }
}
Copier après la connexion

Dans cet exemple, nous créons un assemblage dynamique, module et type. Ensuite, nous créons une propriété et lui attribuons un attribut de validation personnalisé. Enfin, nous créons une instance du type créé dynamiquement et pouvons vérifier que l'attribut est correctement attribué.

En utilisant cette approche, nous évitons l'exception « La collection était de taille fixe » et attribuons dynamiquement des attributs aux propriétés. , permettant une plus grande flexibilité dans la modification des propriétés d'exécution.

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