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); } }
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!