Beim Anpassen von Eigenschaften zur Laufzeit kommt es häufig zu Problemen beim Hinzufügen von Attributen. In solchen Szenarien tritt häufig der Fehler „Sammlung hatte eine feste Größe“ auf.
Im bereitgestellten Codeausschnitt tritt der Fehler auf, weil der Versuch, ein Attribut zu einer vorhandenen Eigenschaft hinzuzufügen, die Änderung des Eigenschaftsdeskriptors beinhaltet unveränderlich.
Um dieses Problem zu beheben, besteht ein Ansatz darin, eine neue Eigenschaft zu erstellen und ihr die gewünschten Attribute hinzuzufügen. Dies erfordert jedoch eine Neukonstruktion des Typs, was nicht effizient ist.
Eine alternative und praktischere Lösung ist die Nutzung dynamischer Baugruppen. Dadurch kann zur Laufzeit ein neuer Typ mit den gewünschten Attributen erstellt werden.
Das folgende Codebeispiel zeigt, wie ein dynamischer Typ mit einem benutzerdefinierten Attribut erstellt wird:
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); } }
In diesem Ansatz erstellen wir einen neuen Typ und fügen bei seiner Definition das gewünschte Attribut hinzu. Dadurch können wir Eigenschaften und ihre Attribute dynamisch anpassen, ohne vorhandene Objekte zu ändern.
Das obige ist der detaillierte Inhalt vonWie kann ich Eigenschaften in C# dynamisch Attribute hinzufügen, ohne dass der Fehler „Sammlung hatte eine feste Größe' auftritt?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!