在運行時自訂屬性時,在嘗試新增屬性時通常會遇到問題。在這種情況下,經常會出現「Collection was of a fixed size」錯誤。
在提供的程式碼片段中,發生錯誤是因為嘗試在現有屬性中新增屬性涉及修改屬性描述符,即不可變。
要解決此問題,一種方法是建立一個新屬性並向其添加所需的屬性。但是,這需要重建類型,效率不高。
另一個更實用的解決方案是利用動態組件。這允許在運行時創建一個新類型,並應用所需的屬性。
以下程式碼範例示範如何使用自訂屬性建立動態類型:
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); } }
在此方法中,我們建立一個新類型並在其定義期間新增所需的屬性。這使我們能夠動態自訂屬性及其屬性,而無需修改現有物件。
以上是如何在 C# 中動態新增屬性而不出現「集合具有固定大小」錯誤?的詳細內容。更多資訊請關注PHP中文網其他相關文章!