このコード サンプルは、実行時に検証属性をプロパティに追加する方法を示します。これは、リフレクションを利用してプロパティの 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 中国語 Web サイトの他の関連記事を参照してください。