首頁 > 後端開發 > C++ > 如何在 C# 中動態地將屬性指派給屬性而不出現「集合具有固定大小」異常?

如何在 C# 中動態地將屬性指派給屬性而不出現「集合具有固定大小」異常?

Susan Sarandon
發布: 2025-01-02 22:42:40
原創
706 人瀏覽過

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

動態為屬性分配屬性

在嘗試在運行時為屬性分配驗證屬性時,您遇到了「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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板