Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah Saya Boleh Menambah Atribut Pengesahan secara Dinamik pada Hartanah dalam C#?

Bagaimanakah Saya Boleh Menambah Atribut Pengesahan secara Dinamik pada Hartanah dalam C#?

Patricia Arquette
Patricia Arquetteasal
2025-01-03 09:40:40483semak imbas

How Can I Dynamically Add Validation Attributes to Properties in C#?

Menambahkan Atribut pada Sifat Secara Dinamik

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.

Analisis Kod

// 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 });

Analisis Pengecualian

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.

Penyelesaian

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn