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