동적으로 속성에 속성 할당
런타임 시 속성에 유효성 검사 속성을 할당하려고 시도하는 동안 "컬렉션이 다음과 같습니다. 고정된 크기" 예외. 이 오류의 원인은 속성 설명자의 속성 컬렉션을 직접 수정할 수 없기 때문입니다. 우리의 목표는 속성 할당을 수행하기 위한 대체 접근 방식을 탐색하는 것입니다.
제공된 코드 조각은 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!