ホームページ > バックエンド開発 > C++ > 「コレクションは固定サイズでした」エラーを発生させずに、C# でプロパティに属性を動的に追加するにはどうすればよいですか?

「コレクションは固定サイズでした」エラーを発生させずに、C# でプロパティに属性を動的に追加するにはどうすればよいですか?

Susan Sarandon
リリース: 2025-01-03 01:22:39
オリジナル
893 人が閲覧しました

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

属性をプロパティに動的に追加する

実行時にプロパティをカスタマイズする場合、属性を追加しようとすると問題が発生することがよくあります。このようなシナリオでは、「コレクションは固定サイズでした」というエラーがよく発生します。

提供されたコード スニペットでは、既存のプロパティに属性を追加しようとする際に、プロパティ記述子の変更が含まれるためにエラーが発生します。 immutable.

この問題に対処する 1 つのアプローチは、新しいプロパティを作成し、それに必要な属性を追加することです。ただし、これには型を再構築する必要があり、効率的ではありません。

代替のより実用的な解決策は、動的アセンブリを利用することです。これにより、必要な属性が適用された新しい型を実行時に作成できます。

次のコード例は、カスタム属性を持つ動的型を作成する方法を示しています。

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 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート