実行時にプロパティをカスタマイズする場合、属性を追加しようとすると問題が発生することがよくあります。このようなシナリオでは、「コレクションは固定サイズでした」というエラーがよく発生します。
提供されたコード スニペットでは、既存のプロパティに属性を追加しようとする際に、プロパティ記述子の変更が含まれるためにエラーが発生します。 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 サイトの他の関連記事を参照してください。