属性をプロパティに動的に割り当てる
実行時にプロパティに検証属性を割り当てようとすると、「コレクションは固定サイズ」の例外です。このエラーの原因は、プロパティ記述子の属性コレクションを直接変更できないことです。私たちの目的は、属性の割り当てを実現するための代替アプローチを検討することです。
提供されたコード スニペットは、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 中国語 Web サイトの他の関連記事を参照してください。