Rumah > pembangunan bahagian belakang > C++ > Bagaimanakah Saya Boleh Menetapkan Atribut Secara Dinamik kepada Sifat dalam C# Tanpa Pengecualian 'Koleksi adalah saiz tetap'?

Bagaimanakah Saya Boleh Menetapkan Atribut Secara Dinamik kepada Sifat dalam C# Tanpa Pengecualian 'Koleksi adalah saiz tetap'?

Susan Sarandon
Lepaskan: 2025-01-02 22:42:40
asal
706 orang telah melayarinya

How Can I Dynamically Assign Attributes to Properties in C# Without the

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);
    }
}
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan