Menetapkan Atribut kepada Sifat Secara Dinamik
Dalam percubaan anda untuk menetapkan atribut pengesahan kepada harta pada masa jalan, anda menemui "Koleksi adalah daripada pengecualian saiz tetap". Sebab di sebalik ralat ini ialah koleksi atribut deskriptor sifat tidak boleh diubah suai secara langsung. Objektif kami adalah untuk meneroka pendekatan alternatif untuk menyelesaikan tugasan atribut.
Coretan kod yang disediakan cuba menggunakan kaedah FillAttributes untuk menambah atribut, tetapi kaedah ini biasanya bertujuan untuk kegunaan dalaman dan mungkin tidak boleh diakses dalam semua kes. Pendekatan yang lebih dipercayai melibatkan mencipta himpunan dan jenis dinamik, kemudian memberikan atribut kepada jenis yang baru dibuat.
Mari kita teliti contoh:
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); } }
Dalam contoh ini, kami mencipta pemasangan dinamik, modul dan jenis. Kemudian, kami mencipta sifat dan menetapkan atribut pengesahan tersuai kepadanya. Akhir sekali, kami mencipta tika jenis yang dicipta secara dinamik dan boleh mengesahkan bahawa atribut ditetapkan dengan betul.
Dengan menggunakan pendekatan ini, kami mengelakkan pengecualian "Koleksi adalah saiz tetap" dan secara dinamik menetapkan atribut kepada sifat , membolehkan lebih fleksibiliti dalam pengubahsuaian harta masa jalan.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Menetapkan Atribut Secara Dinamik kepada Sifat dalam C# Tanpa Pengecualian 'Koleksi adalah saiz tetap'?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!