이 코드 샘플은 런타임 시 속성에 유효성 검사 속성을 추가하는 방법을 보여줍니다. 리플렉션을 활용하여 속성의 FillAttributes 메서드에 액세스하고 원하는 특성을 삽입합니다.
// Get PropertyDescriptor object for the given property name var propDesc = TypeDescriptor.GetProperties(typeof(T))[propName]; // Get FillAttributes methodinfo delegate var methodInfo = propDesc.GetType().GetMethods(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic) .FirstOrDefault(m => m.IsFamily || m.IsPublic && m.Name == "FillAttributes"); // Create Validation attribute var attribute = new RequiredAttribute(); var attributes = new ValidationAttribute[] { attribute }; // Invoke FillAttribute method methodInfo.Invoke(propDesc, new object[] { attributes });
그러나 실행 시 " 컬렉션이 고정된 크기였습니다.' 예외입니다. 이는 속성의 유효성 검사 특성 컬렉션이 고정 크기 배열로 정의되어 있기 때문에 발생합니다. 이 문제를 해결하려면 기존 어레이를 더 큰 새 어레이로 교체해야 합니다.
이 문제를 해결하려면 사용자 정의 속성 캐싱 시스템을 구현하여 속성을 동적으로 저장하고 적용할 수 있습니다. . 구현 예는 다음과 같습니다.
// Initialize cache dictionary and synchronization mechanism private static readonly Dictionary<Type, Attribute[]> AttributeCache = new Dictionary<Type, Attribute[]>(); private static readonly object SyncObject = new object(); protected override Attribute[] GetCustomAttributes(Type attributeType, bool inherit) { if (AttributeCache.TryGetValue(this.GetType(), out Attribute[] cachedAttrs)) { return cachedAttrs; } else { lock (SyncObject) { if (!AttributeCache.TryGetValue(this.GetType(), out cachedAttrs)) { cachedAttrs = base.GetCustomAttributes(attributeType, inherit); AttributeCache.Add(this.GetType(), cachedAttrs); } } return cachedAttrs; } }
이 사용자 정의 캐싱 메커니즘을 사용하면 코드는 고정 크기 컬렉션 예외를 발생시키지 않고 런타임 시 속성에 유효성 검사 특성을 성공적으로 추가합니다.
위 내용은 C#의 속성에 유효성 검사 특성을 동적으로 추가하려면 어떻게 해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!