首頁 > 後端開發 > C++ > 如何在 C# 中動態新增屬性而不出現「集合具有固定大小」錯誤?

如何在 C# 中動態新增屬性而不出現「集合具有固定大小」錯誤?

Susan Sarandon
發布: 2025-01-03 01:22:39
原創
892 人瀏覽過

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

動態向屬性添加屬性

在運行時自訂屬性時,在嘗試新增屬性時通常會遇到問題。在這種情況下,經常會出現「Collection was of a fixed size」錯誤。

在提供的程式碼片段中,發生錯誤是因為嘗試在現有屬性中新增屬性涉及修改屬性描述符,即不可變。

要解決此問題,一種方法是建立一個新屬性並向其添加所需的屬性。但是,這需要重建類型,效率不高。

另一個更實用的解決方案是利用動態組件。這允許在運行時創建一個新類型,並應用所需的屬性。

以下程式碼範例示範如何使用自訂屬性建立動態類型:

using System;
using System.Reflection;
using System.Reflection.Emit;

public static class DynamicAttributeAddition
{
    public static void Main(string[] args)
    {
        // Define the assembly and module
        var assemblyName = new AssemblyName("DynamicAttributeAdditionAssembly");
        var assembly = AppDomain.CurrentDomain.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.Run);
        var module = assembly.DefineDynamicModule(assemblyName.Name);

        // Define the dynamic type
        var typeBuilder = module.DefineType("DynamicType", TypeAttributes.Public);

        // Define the custom attribute constructor
        var attributeConstructorParameters = new Type[] { typeof(string) };
        var attributeConstructor = typeof(CustomAttribute).GetConstructor(attributeConstructorParameters);

        // Define the custom attribute and add it to the dynamic type
        var attributeBuilder = new CustomAttributeBuilder(attributeConstructor, new object[] { "Some Value" });
        typeBuilder.SetCustomAttribute(attributeBuilder);

        // Create the dynamic type
        var dynamicType = typeBuilder.CreateType();

        // Get the custom attribute from the dynamic type
        var attribute = dynamicType.GetCustomAttributes(typeof(CustomAttribute), false).Single();

        // Print the attribute value
        Console.WriteLine(attribute.ConstructorArguments[0].Value);
    }
}
登入後複製

在此方法中,我們建立一個新類型並在其定義期間新增所需的屬性。這使我們能夠動態自訂屬性及其屬性,而無需修改現有物件。

以上是如何在 C# 中動態新增屬性而不出現「集合具有固定大小」錯誤?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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