動態為屬性分配屬性
在嘗試在運行時為屬性分配驗證屬性時,您遇到了「Collection was of固定大小」例外。此錯誤背後的原因是屬性描述符的屬性集合無法直接修改。我們的目標是探索一種替代方法來完成屬性分配。
提供的程式碼片段嘗試使用 FillAttributes 方法來新增屬性,但此方法通常僅供內部使用,可能無法在所有情況下存取案例。更可靠的方法是建立動態組件和類型,然後將屬性指派給新建立的類型。
讓我們深入研究一個範例:
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); } }
在此範例中,我們建立一個動態組裝、模組和類型。然後,我們建立一個屬性並為其指派自訂驗證屬性。最後,我們建立動態建立類型的實例,並可以驗證屬性是否已正確指派。
透過使用這種方法,我們避免了「集合具有固定大小」異常,並將屬性動態分配給屬性,允許運行時屬性修改具有更大的靈活性。
以上是如何在 C# 中動態地將屬性指派給屬性而不出現「集合具有固定大小」異常?的詳細內容。更多資訊請關注PHP中文網其他相關文章!