Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah Saya Boleh Menambah Atribut Pengesahan secara Dinamik pada Hartanah dalam C#?
Sampel kod ini menunjukkan cara menambah atribut pengesahan pada sifat pada masa jalan. Ia memanfaatkan refleksi untuk mengakses kaedah FillAttributes harta dan menyuntik atribut yang diingini.
// Get PropertyDescriptor object for the given property name var propDesc = TypeDescriptor.GetProperties(typeof(T))[propName]; // Get FillAttributes methodinfo delegate var methodInfo = propDesc.GetType().GetMethods(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic) .FirstOrDefault(m => m.IsFamily || m.IsPublic && m.Name == "FillAttributes"); // Create Validation attribute var attribute = new RequiredAttribute(); var attributes = new ValidationAttribute[] { attribute }; // Invoke FillAttribute method methodInfo.Invoke(propDesc, new object[] { attributes });
Walau bagaimanapun, selepas pelaksanaan, anda mungkin menghadapi " Koleksi adalah daripada saiz tetap" pengecualian. Ini berlaku kerana koleksi atribut pengesahan harta ditakrifkan sebagai tatasusunan saiz tetap. Untuk menangani perkara ini, kita perlu menggantikan tatasusunan sedia ada dengan tatasusunan baharu yang lebih besar.
Untuk menyelesaikan isu ini, anda boleh melaksanakan sistem caching atribut tersuai untuk menyimpan dan menggunakan atribut secara dinamik . Contoh pelaksanaan mungkin:
// Initialize cache dictionary and synchronization mechanism private static readonly Dictionary<Type, Attribute[]> AttributeCache = new Dictionary<Type, Attribute[]>(); private static readonly object SyncObject = new object(); protected override Attribute[] GetCustomAttributes(Type attributeType, bool inherit) { if (AttributeCache.TryGetValue(this.GetType(), out Attribute[] cachedAttrs)) { return cachedAttrs; } else { lock (SyncObject) { if (!AttributeCache.TryGetValue(this.GetType(), out cachedAttrs)) { cachedAttrs = base.GetCustomAttributes(attributeType, inherit); AttributeCache.Add(this.GetType(), cachedAttrs); } } return cachedAttrs; } }
Dengan mekanisme caching tersuai ini, kod akan berjaya menambah atribut pengesahan pada sifat pada masa jalan tanpa menyebabkan pengecualian pengumpulan saiz tetap.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Menambah Atribut Pengesahan secara Dinamik pada Hartanah dalam C#?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!